【问题标题】:Download file from Flask application running in Docker container从 Docker 容器中运行的 Flask 应用程序下载文件
【发布时间】:2018-12-11 13:47:50
【问题描述】:

我正在制作一个在 Docker 容器中运行的 Flask 应用程序。到目前为止一切正常,但现在我想创建一个 GET 方法,它应该返回一个要由用户下载的文件。为此,我尝试了 Flask 函数 send_filesend_from_directory。当我按原样运行我的应用程序时,它们都可以工作,但是一旦我将它放入 Docker 容器中,事情就会停止工作。

如果我使用send_file,我会收到file not found 错误,尽管我可以使用相同的文件路径调用print(os.path.isfile),它会显示出来。

如果我使用正确的路径和文件名使用send_from_directory,那么我会得到一个 404 错误。

同样,这仅适用于从 Docker 容器运行时。会不会是权限问题?

方法示例:

class DownloadLog(Resource):
    def get(self):
        print(os.path.isfile('logfile.log')  # Returns 'True'
        return send_from_directory('.', 'logfile.log')

【问题讨论】:

  • 权限问题会抛出 403 Forbidden 或未授权,而不是 404。所以情况可能并非如此

标签: python docker flask


【解决方案1】:

我遇到了同样的问题,当应用在容器中运行时,我通过传递完整文件路径而不是相对路径来修复它。

例如,当我只运行烧瓶时,我可以使用类似的东西:

send_from_directory(
    current_app.config["DOWNLOAD_FOLDER"], filename.jpg, as_attachment=True
)

但是,如果在容器中运行应用程序,我需要将其更改为:

send_from_directory(
    os.path.join(os.getcwd(), current_app.config["DOWNLOAD_FOLDER"]),
    filename.jpg,
    as_attachment=True,
)

基本上os.getcwd() 是在 Dockerfile 或 docker-compose.yml 文件中定义的应用根文件夹。

【讨论】:

    【解决方案2】:

    虽然迟了将近一年才回答这个问题,

    当您按原样执行 flask_application 并使用 send_from_directory(directory/path, filename, as_attachment=True) 时,它会从您的 HOST OS 文件系统(Windows、Linux、macOS)发送文件。

    当您在 docker 容器中执行 flask_application 并使用 send_from_directory(directory/path, filename, as_attachment=True) 时,它会从您的 WORKDIR (/app) 发送文件。由于flask在WORKDIR中找不到文件,所以报404。

    如果您希望它在 docker 中工作,您可以 ADD or COPY 您希望用户下载的文件,然后使用他们在 send_from_directory 中的路径,或者您也可以使用卷。

    希望对你有帮助!

    PS:今天我也经历了同样的事情!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多