我正在制作一个在Docker容器中运行的Flask应用程序。到目前为止,一切工作正常,但是现在我想创建一个GET方法,该方法应该返回一个文件,供用户下载。为此,我尝试了Flask函数send_file
和send_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')
答案 0 :(得分:0)
我遇到了同样的问题,当应用程序在容器中运行时,我通过传递完整文件路径而不是相对路径来解决此问题。
例如,当我只运行烧瓶时,我可以使用类似的东西:
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文件中定义的应用程序根文件夹。
答案 1 :(得分:0)
尽管要回答这个问题将近一年,
按原样执行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
您要用户下载的文件,然后在{{1}}中使用其路径,或者也可以使用卷。
希望有帮助!
PS:今天我经历了同样的事情!