【发布时间】:2021-10-28 23:59:31
【问题描述】:
我正在努力解决以下问题:在 Flask 中提供媒体文件的正确方法是什么?我在博客系统中建立了一个模型Posts,我正在使用flask-file-upload
# models/blog.py
from app import db, file_upload
@file_upload.Model
class Posts(db.Model):
"""
Defines the attributes of posts table in the database
"""
...
image = file_upload.Column()
...
在我的settings.py 文件中
import os
from pathlib import Path
PROJECT_ROOT = Path(__file__).parent.parent
UPLOAD_FOLDER = os.path.join(PROJECT_ROOT, 'media')
所以,当我添加 Post 对象时,它会将文件名保存在数据库中,并将文件保存在媒体文件夹中,路径为 media/posts/<post_id>/filename
到目前为止,它运行良好。但我需要提供这些图片,所以我创建了以下路线:
# routes.py
from app import app
@app.get('/media/<path:path>')
def send_media(path):
"""
:param path: a path like "posts/<int:post_id>/<filename>"
:return:
"""
path_list = path.split('/')
path_ = '/'.join(path_list[:-1]) + '/'
file_name = path_list[-1]
return send_from_directory(
directory=app.config['UPLOAD_FOLDER'], path=path_, filename=file_name, as_attachment=True
)
但是当我浏览http://127.0.0.1:5000/media/posts/15/python.jpg时它不起作用
我的 Flask 应用程序响应 404 - Not Found,即使 python.jpg 文件在那里。
如何正确访问 Flask 中的媒体文件?
我需要这个,因为我必须创建一个发送 file_name 的 API,并且前端将呈现图像,类似于
<img src="http://localhost:8000/media/posts/<post_id>/file_name">
【问题讨论】: