cherrypy - 提供静态文件并强制内容类型
我正在用cherrypy搭建一个小型的网页应用。
在这个应用中,我需要以两种不同的方式提供文件:
- 以正确的mime类型提供文件,这样可以嵌入到网页中,
- 以
application/octet-stream
的mime类型提供文件,这样可以强制下载。
目前,我添加了一个公开的方法来流式传输文件,一个在/document/xx
,返回正确的mime类型,另一个在/download/xx
,使用octet-stream的mime类型。
但是我希望避免自己编写这些代码。这样做只会带来错误和安全问题。
简而言之:我该如何强制cherrypy的tools.staticdir
进行强制下载?
可以在github上查看这个应用的完整代码:https://github.com/aspyct/docrepo(请注意,它仍在使用旧的'config.ini'文件,而不是配置字典)。
1 个回答
4
你可以通过提供 content_types
来强制工具工作,这个内容类型会把文件扩展名和MIME类型对应起来。就像这样。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import cherrypy
path = os.path.abspath(os.path.dirname(__file__))
config = {
'global' : {
'server.socket_host' : '127.0.0.1',
'server.socket_port' : 8080,
'server.thread_pool' : 8
},
'/static' : {
'tools.staticdir.on' : True,
'tools.staticdir.dir' : os.path.join(path, 'static'),
'tools.staticdir.content_types' : {'html': 'application/octet-stream'}
}
}
if __name__ == '__main__':
cherrypy.quickstart(config = config)
如果你事先不知道文件的扩展名,可以看看这个工具的 源代码。里面的有效代码行数不多,只有二十行左右。你可以根据自己的需要,制作一个更合适的工具。