如何从 Flask 服务器正确地服务器静态文件?
How to properly server static files from a Flask server?
从 Flask 服务器提供静态文件(图像、PDF、文档等)的正确方法是什么?
我以前用过send_from_directory
方法,效果很好。这是我的实现:
@app.route('/public/assignments/<path:filename>')
def file(filename):
return send_from_directory("./public/assignments/", filename, as_attachment=True)
但是,如果我有多个不同的文件夹,它可能会变得有点忙乱和重复,因为您实际上是在为不同的文件位置编写相同的代码 - 这意味着如果我想为用户而不是任务显示文件,我必须将其更改为 /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/
目录中。
恐怕我在这里能做的不多,只能希望有人遇到了同样的问题 issue/problem 并找到了修复它的方法。
这是文件夹树:
├── [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:添加了树
初始化应用程序时传递这些参数:
app = Flask(__name__, static_folder='public',
static_url_path='frontend_public' )
这将使文件 public/blah.txt
在 http://example.com/frontend_public/blah.txt
可用。
static_folder
设置文件系统上的文件夹
static_url_path
设置 URL 中使用的路径
如果两个变量都没有设置,则两者都默认为 'static'
。
希望这就是您要问的。
从 Flask 服务器提供静态文件(图像、PDF、文档等)的正确方法是什么?
我以前用过send_from_directory
方法,效果很好。这是我的实现:
@app.route('/public/assignments/<path:filename>')
def file(filename):
return send_from_directory("./public/assignments/", filename, as_attachment=True)
但是,如果我有多个不同的文件夹,它可能会变得有点忙乱和重复,因为您实际上是在为不同的文件位置编写相同的代码 - 这意味着如果我想为用户而不是任务显示文件,我必须将其更改为 /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/
目录中。
恐怕我在这里能做的不多,只能希望有人遇到了同样的问题 issue/problem 并找到了修复它的方法。
这是文件夹树:
├── [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:添加了树
初始化应用程序时传递这些参数:
app = Flask(__name__, static_folder='public',
static_url_path='frontend_public' )
这将使文件 public/blah.txt
在 http://example.com/frontend_public/blah.txt
可用。
static_folder
设置文件系统上的文件夹static_url_path
设置 URL 中使用的路径
如果两个变量都没有设置,则两者都默认为 'static'
。
希望这就是您要问的。