Python 如何用flask创建动态文件发送算法
我在用烧瓶提供文件方面有一些问题 首先,我的文件树:Python 如何用flask创建动态文件发送算法,python,flask,sendfile,Python,Flask,Sendfile,我在用烧瓶提供文件方面有一些问题 首先,我的文件树: processedMain --processed1 --processed2 --... --processedN 在每个文件夹中,我都有一堆文件,我将它们全部表示在表中,我将href链接和每个文件的路径放在一起,并通过带有send_file return的route函数传递它们 问题是,我能够使它工作的唯一方法是为每个硬编码的子文件夹创建@app.route,如下所示: @app.route('/' + pathFits1[1] + '
processedMain
--processed1
--processed2
--...
--processedN
在每个文件夹中,我都有一堆文件,我将它们全部表示在表中,我将href链接和每个文件的路径放在一起,并通过带有send_file return的route函数传递它们
问题是,我能够使它工作的唯一方法是为每个硬编码的子文件夹创建@app.route,如下所示:
@app.route('/' + pathFits1[1] + '<id>', methods=['GET'])
def returnImg1(id):
return send_file(pathFits1[1] + id, as_attachment=True, attachment_filename=id)
@app.route('/' + pathFits1[2] +'<id>', methods=['GET'])
def returnImg2(id):
return send_file(pathFits1[2] + id, as_attachment=True, attachment_filename=id)
@app.route('/' + pathFits1[3] + '<id>', methods=['GET'])
def returnImg3(id):
return send_file(pathFits1[3] + id, as_attachment=True, attachment_filename=id)
from flask import Flask, send_file, request
app = Flask(__name__)
pathFits1 = [None] * 3
pathFits1[1] = 'content/images1/'
pathFits1[2] = 'content/images2/'
@app.route('/returnimg', methods=['GET'])
def returnImg():
global pathFits1
id = request.args.get('id')
path = request.args.get('path')
print("ID:", id, "\tpath:", path)
# try to send the file if the subpath is valid
if path in pathFits1:
print("valid path, attempting to sending file")
try:
return send_file(path + id, as_attachment=True, attachment_filename=id)
except Exception as e:
print(e)
return "file not found"
return "invalid path"
@app.route('/'+pathFits1[1]+'',方法=['GET'])
def返回IMG1(id):
返回发送文件(路径fits1[1]+id,如附件=True,附件=id)
@app.route('/'+pathFits1[2]+'',方法=['GET'])
def返回IMG2(id):
返回发送文件(路径fits1[2]+id,如附件=True,附件=id)
@app.route('/'+pathFits1[3]+'',方法=['GET'])
def返回IMG3(id):
返回发送文件(路径fits1[3]+id,如附件=True,附件=id)
其中pathFits1[i]是子文件夹的路径,当用户单击web表中的文件时传递id
问题是我有很多子文件夹,而且为每个子文件夹创建@app.route都很累。
这是否可能为每件事只创建一条路线
附言。
我对烧瓶很陌生,所以如果我忘了告诉什么,请告诉我,我会填好的
解决方案
事实上,这是令人尴尬的简单。
正如@Dan.D所指出的,flask有捕获变量的转换器,对我来说这就是我所需要的,因为我的id变量已经包含了文件的完整路径。
所以现在只有这3行代码代替了一整串或重复的代码:
@app.route('/<path:id>')
def returnImg(id):
fileName = id.rsplit('/', 1)[-1]
return send_file(id, as_attachment=True, attachment_filename=fileName)
@app.route(“/”)
def returnImg(标识):
fileName=id.rsplit('/',1)[-1]
返回发送文件(id,如附件=True,附件=filename)
其中id是文件的完整路径,path:是路径的转换器,fileName是用户将下载的文件名,其中不包含路径(全部在最后一个斜杠之后)您可以在路由表达式中捕获路径。从文件中:
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
# show the subpath after /path/
return 'Subpath %s' % subpath
@app.route(“/path/”)
def显示_子路径(子路径):
#在/path之后显示子路径/
返回“子路径%s”%Subpath
据我所知,Flask不支持
@app.route
URL中的多个变量部分。但是,您可以将文件的完整路径设置为变量节,然后对其进行解析以提取子文件夹路径和文件ID
下面是一个工作示例:
pathFits1 = [None] * 3
pathFits1[1] = 'content/images1/'
pathFits1[2] = 'content/images2/'
@app.route('/<path:fullpath>', methods=['GET'])
def returnImg(fullpath):
global pathFits1
print("--> GET request: ", fullpath)
# parse the full path to extract the subpath and ID
# subpath: get everything until the last slash
subpath = fullpath.rsplit('/', 1)[:-1][0] + '/'
# id: get string after the last slash
id = fullpath.rsplit('/', 1)[-1]
print("ID:", id, "\tsubpath:", subpath)
# try to send the file if the subpath is valid
if subpath in pathFits1:
print("valid path, attempting to sending file")
try:
return send_file(subpath + id, as_attachment=True, attachment_filename=id)
except Exception as e:
print(e)
return "file not found"
return "invalid path"
我能说什么呢。就这么简单!谢谢你给我小费!我将向OP添加解决方案。