cherrypy - 提供静态文件并强制内容类型

0 投票
1 回答
1948 浏览
提问于 2025-04-18 16:21

我正在用cherrypy搭建一个小型的网页应用。

在这个应用中,我需要以两种不同的方式提供文件:

  1. 以正确的mime类型提供文件,这样可以嵌入到网页中,
  2. 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)

如果你事先不知道文件的扩展名,可以看看这个工具的 源代码。里面的有效代码行数不多,只有二十行左右。你可以根据自己的需要,制作一个更合适的工具。

撰写回答