【发布时间】:2020-07-21 08:12:05
【问题描述】:
从烧瓶服务器提供静态文件(图像、PDF、文档等)的正确方法是什么?
我之前使用过send_from_directory 方法,效果很好。这是我的实现:
@app.route('/public/assignments/<path:filename>')
def file(filename):
return send_from_directory("./public/assignments/", filename, as_attachment=True)
但是,如果我有多个不同的文件夹,它可能会变得有点忙乱和重复,因为您实际上是在为不同的文件位置编写相同的代码 - 这意味着如果我想为用户显示文件而不是分配,我' d 必须将其更改为 /public/users/<path:filename> 而不是 /public/assignments/<path:filename>。
我想解决这个问题的方法本质上是创建一个/file/<path:filepath> 路由,其中filepath 是目标文件夹的整个路径+文件名和扩展名,而不仅仅是文件名和扩展名。然后我做了一些格式化并将父目录与文件本身分开,并在调用send_from_directory 函数时使用该数据:
@app.route('/file/<path:filepath>', methods=["GET"])
def general_static_files(filepath):
filepath = filepath.split("/")
_dir = ""
for i, p in enumerate(filepath):
if i < len(filepath) - 1:
_dir = _dir + (p + "/")
return send_from_directory(("./" + _dir), filepath[len(filepath) - 1], as_attachment=True)
如果我们模拟以下对该路由的请求:
curl http://127.0.0.1:5000/file/public/files/jobs/images/job_43_image_1.jpg
_dir 变量将保存./public/files/jobs/images/ 值,然后filepath[len(filepath) - 1] 保存job_43_image_1.jpg 值。
如果我点击这条路线,我会收到404 - Not Found 响应,但路线正文中的所有代码都在执行。
我怀疑send_from_directory 函数是我得到404 - Not Found 的原因。但是,我确实将图像 job_43_image_1.jpg 存储在 /public/files/jobs/images/ 目录中。
除了希望有人遇到相同的问题/问题并找到解决方法之外,恐怕我在这里无能为力。
这是文件夹树:
├── [2050] app.py
├── [2050] public
│ ├── [2050] etc
│ └── [2050] files
│ ├── [2050] jobs
│ │ ├── [2050] files
│ │ └── [2050] images
│ │ ├── [2050] job_41_image_decline_1.jpg
│ │ ├── [2050] job_41_image_decline_2554.jpg
│ │ ├── [2050] ...
│ ├── [2050] shop
│ └── [2050] videos
└── [2050] server_crash.log
编辑1:我已经设置了static_url_path。我没有理由相信这可能是我的问题的原因。
编辑 2:添加树
【问题讨论】:
-
@Patch 我正在运行本地环境。在样板环境中,我创建了一个
server文件夹,该文件夹是routes文件夹、models文件夹、public文件夹和app.py本身的主页。 -
由于
app.py和public文件夹共享同一个父文件夹,应该没有问题吧?
标签: flask static-files