静态文件是我们在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; } }