tornado静态文件和缓存文件

40 篇文章 0 订阅
6 篇文章 0 订阅

静态文件是我们在web中经常见到的,如图片文件、css文件、js文件等等,在tornado如何处理呢?

在tornado中,处理静态文件的类StaticFileHandler,在web.py模块中,该类不仅处理静态文件的映射也处理了静态文件的主动式缓存。

处理静态文件时需要设置settings中关于静态文件的值”static_path“,指明静态文件的路径。

settings = {
    "static_path": os.path.join(os.path.dirname(__file__), "static"),
    "cookie_secret": "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=",
    "login_url": "/login",
    "xsrf_cookies": True,
}

上述指定了静态文件的位置在当前目录中的"static"目录下,os.path.join(os.path.dirname(file), "static"),注意后面的"static"不能为"/static",或则就不是当前目录下的”static“目录中,具体原因请参照os的API。

此时,web可以访问在”static“中的静态资源,所有的都会原样显示,比如说template文件,是什么就是什么,不会进行额外的处理。

上述是对于普通的静态文件,有时如果有自定义的需求。如果某个文件特殊,通过一个特殊的url访问(、、、),此时可以在application中的url映射中进行设置。

application = tornado.web.Application([
    (r"/", MainHandler),
    (r"/login", LoginHandler),
    (r"/(apple-touch-icon\.png)", tornado.web.StaticFileHandler, dict(path=settings['static_path'])),
], **settings)

必须要用()括起来,作为请求的一个参数。

经过上述设置后,这对于apple-touch-icon.png的访问可以使用两种方式:

/apple-touch-icon.png
/static/apple-touch-icon.png

对于/robots.txt (搜索引擎遵守的抓取协议)和 /favicon.ico (web的站标)也是会自动作为静态文件处理(即使它们不是以 /static/ 开头),这个性质在application初始化时进行设置的,当然你也可以更改它,修改application的初始化代码即可。

高性能对于web至关重要,不管从前端到后端都是我们经常需要注意的。

缓存文件是一个不错的选择,这样浏览器就不需要发送 不必要的 If-Modified-Since 和 Etag 请求,从而影响页面的渲染速度。 Tornado 可以通过内建的“静态内容分版(static content versioning)”来直接支持这种功能。

要使用这个功能,在模板中就不要直接使用静态文件的 URL 地址了,你需要在 HTML 中使用 static_url() 这个方法来提供 URL 地址(不使用该函数得到的结果同样。):

<html>
   <head>
      <title>FriendFeed - {{ _("Home") }}</title>
   </head>
   <body>
     <div><img src="{{ static_url("images/logo.png") }}"/></div>
   </body>
 </html>

static_url() 函数会将相对地址转成一个类似于 /static/images/logo.png?v=aae54 的 URI,v 参数是 logo.png 文件的散列值, Tornado 服务器会把它发给浏览器,并以此为依据让浏览器对相关内容做永久缓存。

由于 v 的值是基于文件的内容计算出来的,如果你更新了文件,或者重启了服务器 ,那么就会得到一个新的 v 值,这样浏览器就会请求服务器以获取新的文件内容。 如果文件的内容没有改变,浏览器就会一直使用本地缓存的文件,这样可以显著提高页 面的渲染速度。

在生产环境下,你可能会使用nginx这样的更有利于静态文件 伺服的服务器,你可以将 Tornado 的文件缓存指定到任何静态文件服务器上面,下面 是 FriendFeed 使用的 nginx 的相关配置:

location /static/ {
    root /var/friendfeed/static;
    if ($query_string) {
        expires max;
    }
 }

http://www.afewords.com/blog/504356393725171f9c000002

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值