从Flask服务器提供静态文件(图像,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:添加了树
答案 0 :(得分:0)
在初始化应用程序时传递以下参数:
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'
。
希望这是您的要求。