【发布时间】:2017-08-07 14:10:57
【问题描述】:
我有一个 Flask 网络应用程序,它允许用户上传文件,然后下载或在浏览器中显示它们。在生产过程中,我是否应该使用 send_from_directory 从服务器上的上传文件夹中提供这些文件?
【问题讨论】:
-
这完全取决于您的用例 - 如果您需要验证用户是否被允许访问文件,那么是的,您将需要使用
send_from_directory。如果任何人都应该能够访问它们,那么我只会让代理服务器提供upload目录的内容。 -
谢谢,这样做有什么明显的缺点吗?为了安全起见,我宁愿使用 send_from_directory 而不是带有文档 ID 的服务器文件路径,因为上传的文件是特定于用户的。
-
send_from_directory可能更慢(因为它必须经过另一层路由)。但是,如果您需要身份验证,则将其全部集中在您的应用程序中可能是最简单的方法(除非您提供 很多 个文件,否则差异不会很大)。 -
@SeanVieira 请注意,
send_from_directory()不会神奇地猜测 Vary 标头,它会设置Cache-Control: public, ...。因此,如果您使用send_from_directory()发送经过身份验证的文件,您可能需要设置一些附加选项。至少如果您使用未加密的 HTTP,它允许缓存代理。 -
好点-
send_from_directory返回一个Response,所以如果你response = send_from_directory(...); response.headers['Cache-Control'],你可以在上面设置标题
标签: file-upload flask download