首页 > 解决方案 > 在 Linux 服务器上从烧瓶下载文件时出错

问题描述

我的代码在我的 Windows 机器上运行良好:

@app.route('/downloads/<filename>', methods=["GET", "POST"])
def downloads(filename):
    return send_file(filename, as_attachment=True)

它使用标签为 html 页面上列表中的每个特定项目传递变量。在我的 Windows 机器上,我使用反斜杠指定文件名(这是文件的目录)变量(然后无论出于何种原因在搜索栏中转换为“%5C”)。这工作正常,但是当我在我的 linux 机器上运行相同的代码时,它会在浏览器上给我一个“内部服务器错误”,并且在服务器上出现这个错误。

FileNotFoundError: [Errno 2] No such file or directory: '/home/pi/ss/python_files\\user\\file.py'

现在我明白Linux对目录使用“正斜杠”,而Windows出于任何原因使用“反斜杠”,我认为这是错误,但是当我尝试在目录中使用“正斜杠”时,它给了我一个404错误浏览器:

'未找到 在服务器上未找到请求的 URL。如果您手动输入了 URL,请检查您的拼写并重试。

它在服务器上给了我这个:

"GET /downloads/python_files/user/file.py HTTP/1.1" 404 -

这会让你觉得也许我只是有错误的文件路径,但是当我进入与服务器的 python 文件相同的目录并输入:

python3 python_files/user/file.py

它运行文件,所以它的路径没有问题......无论如何,这就是我被难住并意识到我没有足够的知识来修复错误的地方。非常感谢您的帮助!

标签: pythonwindowsflask

解决方案


请参阅本节https://flask.palletsprojects.com/en/1.1.x/quickstart/#variable-rules

或者,您可以使用转换器来指定参数的类型,例如<converter:variable_name >

因此,如果您<path:filename>在路线中指定为转换器,那应该可以解决您的问题

@app.route('/downloads/<path:filename>', methods=["GET", "POST"])

因为如果没有明确指定,它默认为string转换器,它会接受任何没有斜杠的文本,这就是你得到错误的原因

"GET /downloads/python_files/user/file.py HTTP/1.1" 404 -

推荐阅读