1

我有一个 Flask 应用程序,它将在生产环境中运行在 Apache 下。我有一些静态文件,但它们需要经过身份验证的访问。因此,使用 X-Sendfile 来加快身份验证后的文件传递似乎是合理的:

flaskapp = flask.Flask()
flaskapp.use_x_sendfile = True

然后我在哪里生成响应:

return flask.send_file(filepath)

它似乎在 Apache 下运行良好。问题是当我运行开发服务器时:

# Use SharedDataMiddleware to deliver JS, CSS, icons, etc.
flaskapp.wsgi_app = SharedDataMiddleware(flaskapp.wsgi_app, {'/static': '/path/to/static'})
flaskapp.run(host='0.0.0.0', debug=True)

当我以这种方式运行它时use_x_sendfile = True,X-Sendfile 标头显示在实际响应中,并且一个空文件(0 字节)被传递给客户端。关闭 X-Sendfile(并强制浏览器丢弃缓存的文件)解决了这个问题,因此 Werkzeug 服务器 Flask 运行似乎没有处理 X-Sendfile 标头。有没有办法让开发服务器处理 X-Sendfile,或者我在开发过程中被迫关闭它?

4

1 回答 1

2

烧瓶文档提到服务器必须支持X-Sendfile而 werkzeug 的开发服务器不支持(文档中没有提到任何地方,并且通过 werkzeug 的源代码的 grep 来sendfile返回不匹配)。

将此行为添加到服务器可能不会太难,但我不确定支持此类高级功能是否是开发服务器的优先事项。

顺便说一句,作为额外的关键字参数run传递给 werkzeug's run_simple,您不需要自己创建中间件,您可以使用:

flaskapp.run(host='0.0.0.0', debug=True, static_files={'/static': '/path/to/static'})
于 2013-07-02T20:48:54.753 回答