Web应用经常需要服务静态内容,例如图片或者样式表.Ring提供了两个中间件函数来做这个事情.
一个是wrap-file
.它服务来自当前文件系统一个目录的静态内容:
- (use 'ring.middleware.file)
- (def app
- (wrap-file your-handler "/var/www/public"))
另一个是wrap-resource
.它服务来自JVM classpath下的静态内容:
- (use 'ring.middleware.resource)
- (def app
- (wrap-resource your-handler "public"))
如果你使用一个Clojure构建工具,像Leiningen,一个项目的non-source-file资源保存在resources
目录中.目录中的文件自动的保存jar或者war文件中.
所以在上面的例子中,文件被放在resources/public
目录将会被当做静态文件.
经常性的你想要结合wrap-file
或者wrap-resource
和其他中间件,通常是wrap-content-type
和wrap-not-modified
:
- (use 'ring.middleware.resource
- 'ring.middleware.content-type
- 'ring.middleware.not-modified)
- (def app
- (-> your-handler
- (wrap-resource "public")
- (wrap-content-type)
- (wrap-not-modified))
wrap-content-type
中间件选择一个content-type基于文件扩展.例如,一个文件叫做hello.txt
将会获得一个text/plain
的content-type.
wrap-not-modified
中间件在响应中检查(最后定义)Last-Modified
的header对应着在请求中的If-Modified-Since
的header.通过确保客户端不需要下载它们已经缓存的资源,这回节省带宽.
注意这个额外的中间件需要环绕(另一种说法 紧跟)wrap-resource
或者wrap-file
函数.
当前内容版权归 clojure-china 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 clojure-china .