应用中的静态文件
最开始几个文章讲的使用 plackup 来服务当前目录的文件,现在我们学习了怎么样使用中间件和怎么使用 URLMap 来服务多个应用。这又是非常琐碎的功能之一, 你的应用开发所必须的:服务静态文件.
从指定的路径请取文件
很多的框架自己实现了这个功能,但使用了 PSGI 和 Plack 起,框架可以不需要实现此功能了。只需使用 Static 中间件。
use Plack::Builder; my $app = sub { ... }; builder { enable "Static", path => qr!^/static!, root => './htdocs'; $app; }
这会截取全部以 "/static" 的 request,然后映射到 root 目录 htdocs 目录。所以当你请求 "/static/images/foo.jpg" 结果会返回 "./htdocs/static/images/foo.jpg" 这个文件。
常常,我们会想重命名和配置一个目录的名字为一个新的名字,如请求 "/static/index.css" 映射到 "./static-files/index.css",你只要如下操作就行:
builder { enable "Static", path => sub { s!^/static/!! }, root => './static-files'; $app; }
这有个重要的地方,就是使用的回调函数中的 patterm 是使用的 sub {s///} 来替换正则 qr.这个回调中 matche 到的 $_ 会做为 request 的路径,所以在这个地方使用的 来替换掉前面一部分。所以会这时前的 static 就会没有了,直接打开 root 下的 "./static-files/" 目录
因此,"/static/foo.jpg" 会被指到 "./static-files/foo.jpg",全部的请求如果不能 match 这个正则的话,就通过源始的路径到 $app 中来。
在 Perl 中讲任何事情都不只一个以上的方式去做。当你了解如何使用 mount 和 URLMap 然后使用 App::File 的 mount 应该更加直观。前面的例子可以这样写:
use Plack::Builder; builder { mount "/static" => Plack::App::File->new(root => "./static-files"); mount "/" => $app; };
这的方法不同,但我想前面这个比现在这个更加常用,因为上面的 Static 的静态中间件的回调,是使用基于配置的路径,让你可以写更加复杂的正则。当你不合适使用 URLMap 和 mount 选择上面的方法是更加合适你的。
这是我的译文,原文件地址:http://advent.plackperl.org/2009/12/day-17-serving-static-files-from-your-application.html
建议继续学习:
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:扶凯 来源: 扶凯
- 标签: 静态 静态文件
- 发布时间:2011-08-19 23:10:33
- [67] Oracle MTS模式下 进程地址与会话信
- [65] 如何拿下简短的域名
- [65] Go Reflect 性能
- [59] 图书馆的世界纪录
- [59] 【社会化设计】自我(self)部分――欢迎区
- [59] android 开发入门
- [58] IOS安全–浅谈关于IOS加固的几种方法
- [53] 视觉调整-设计师 vs. 逻辑
- [47] 读书笔记-壹百度:百度十年千倍的29条法则
- [47] 界面设计速成