【问题标题】:Flask send_from_directory烧瓶 send_from_directory
【发布时间】: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


【解决方案1】:

最好让 nginx 为您的静态文件提供服务。众所周知,flask 对于​​这项任务的性能相对较差。但是,如果您的服务器没有得到充分利用,那也没关系。

【讨论】:

    【解决方案2】:

    我已经实现了这种想法。我正在使用烧瓶休息。但是您可以将此作为参考。 上传文件

    from document_folder.config import dir_path file = data['file'] #data is a reqparse. filename = werkzeug.secure_filename(file.filename) file.save(os.path.join(str(dir_path), str(filename))

    config.py 用于文档静态文件夹。将其放在文档静态文件夹中

    import os dir_path = os.path.dirname(os.path.realpath(__file__))

    用于下载 您必须将文档的名称保存到您的数据库中才能下载文档。

    docu = DocumentModel.exists(_id) if docu: filename = docu.filename return send_file(os.path.join(dir_path, filename), as_attachment=True)

    解析器应该是这样的。

    parser.add_argument('file', type=werkzeug.datastructures.FileStorage, location='files' )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-26
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 2020-12-16
      • 2019-09-11
      相关资源
      最近更新 更多