tornado下使用静态文件和文件缓存
静态文件和文件缓存
1、在应用配置 settings 中指定 static_path
选项来提供静态文件服务;
2、在应用配置 settings 中指定 static_url_prefix
选项来提供静态文件前缀服务;
3、在导入静态文件时用 {{static_url('XX.css')}}
方式实现主动缓存静态文件
Tornado中, 你可以通过在应用程序中指定特殊的 static_path
来提供静态文 件服务:
settings = { "static_path": os.path.join(os.path.dirname(__file__), "static"), "cookie_secret": "__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__", "login_url": "/login", "xsrf_cookies": True, } application = tornado.web.Application([ (r"/", MainHandler), (r"/login", LoginHandler), (r"/(apple-touch-icon\.png)", tornado.web.StaticFileHandler, dict(path=settings['static_path'])), ], **settings)
为了改善性能, 通常情况下, 让浏览器主动缓存静态资源是个好主意, 这样浏览器 就不会发送不必要的可能在渲染页面时阻塞的 If-Modified-Since
或 Etag
请求了. Tornado使用 静态内容版本(static content versioning) 来支持此项功能.
关于缓存的内容:http://www.cnblogs.com/_franky/archive/2012/07/05/2577141.html
为了使用这些功能, 在你的模板中使用 static_url
方法 而不是直接在你的HTML中输入静态文件的URL:
<html> <head> <title>FriendFeed - {{ _("Home") }}</title> </head> <body> <div><img src="{{ static_url("images/logo.png") }}"/></div> </body> </html>
因为参数 v
是基于文件内容的, 如果你更新一个文件并重启服务, 它将发送一个新的 v
值, 所以用户的浏览器将会自动的拉去新的文件. 如果文件的内容没有改变, 浏览器将会继续使用本地缓存的副本, 而不会从服务器检查更新, 显著的提高了渲染性能.
在生产中, 你可能想提供静态文件通过一个更优的静态服务器, 比如 nginx . 你可以配置任何web服务器识别通过 static_url()
提供的版本标签并相应的设置缓存头. 下面是我们在 FriendFeed 使用的nginx相关配置的一部分:
location /static/ { root /var/friendfeed/static; if ($query_string) { expires max; } }