Python 烧瓶:`@在此请求之后`不工作
我想在用户下载由flask应用程序创建的文件后删除一个文件 为此,我发现这并没有如预期的那样工作,并引发了一个错误,告诉您此请求后的Python 烧瓶:`@在此请求之后`不工作,python,python-3.x,flask,request,delete-file,Python,Python 3.x,Flask,Request,Delete File,我想在用户下载由flask应用程序创建的文件后删除一个文件 为此,我发现这并没有如预期的那样工作,并引发了一个错误,告诉您此请求后的未定义 因此,我对如何使用该方法进行了更深入的研究。因此,我扩展了代码,在这个请求之后定义了一个函数,如示例代码段所示 分别执行代码。运行服务器可以按预期工作。但是,文件不会被删除,因为在请求之后,@after\u未调用此请求,这一点很明显,因为请求之后,。未打印到终端中的烧瓶输出: #!/usr/bin/env python3 # coding: utf-8
未定义
因此,我对如何使用该方法进行了更深入的研究。因此,我扩展了代码,在这个请求之后定义了一个
函数,如示例代码段所示
分别执行代码。运行服务器可以按预期工作。但是,文件不会被删除,因为在请求之后,@after\u未调用此请求
,这一点很明显,因为请求之后,。
未打印到终端中的烧瓶输出:
#!/usr/bin/env python3
# coding: utf-8
import os
from operator import itemgetter
from flask import Flask, request, redirect, url_for, send_from_directory, g
from werkzeug.utils import secure_filename
UPLOAD_FOLDER = '.'
ALLOWED_EXTENSIONS = set(['csv', 'xlsx', 'xls'])
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
def after_this_request(func):
if not hasattr(g, 'call_after_request'):
g.call_after_request = []
g.call_after_request.append(func)
return func
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
flash('No selected file')
return redirect(request.url)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(filepath)
@after_this_request
def remove_file(response):
print('After request ...')
os.remove(filepath)
return response
return send_from_directory('.', filename=filepath, as_attachment=True)
return '''
<!doctype html>
<title>Upload a file</title>
<h1>Uplaod new file</h1>
<form action="" method=post enctype=multipart/form-data>
<p><input type=file name=file>
<input type=submit value=Upload>
</form>
'''
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=True)
#/usr/bin/env蟒蛇3
#编码:utf-8
导入操作系统
从运算符导入itemgetter
从flask导入flask、请求、重定向、url\u for、从\u目录发送\u、g
从werkzeug.utils导入安全文件名
上载文件夹='。'
允许的扩展名=设置(['csv'、'xlsx'、'xls'])
app=烧瓶(名称)
app.config['UPLOAD\u FOLDER']=UPLOAD\u FOLDER
允许的def_文件(文件名):
在文件名和\
允许的扩展名中的filename.rsplit('.',1)[1]
此请求后的def(func):
如果不是hasattr(g,“请求后呼叫”:
g、 在请求后调用
g、 在请求后调用。追加(func)
返回函数
@app.route('/',方法=['GET','POST'])
def upload_文件():
如果request.method==“POST”:
如果“文件”不在request.files中:
闪存(“无文件部分”)
返回重定向(request.url)
file=request.files['file']
如果file.filename=='':
闪存('没有选定的文件')
返回重定向(request.url)
如果文件和允许的文件(file.filename):
filename=secure\u文件名(file.filename)
filepath=os.path.join(app.config['UPLOAD\u FOLDER'],文件名)
file.save(文件路径)
@在这个请求之后
def删除_文件(响应):
打印('请求后…')
删除(文件路径)
返回响应
从_目录('.',filename=filepath,as_attachment=True)返回send_
返回“”'
上传文件
上传新文件
'''
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
运行(主机=0.0.0.0',端口=8080,调试=True)
我错过了什么?如何确保在此请求后调用@decorator后面的函数,以便在用户下载文件后删除该文件
注意:使用Flask版本0.11.1时,请确保从导入装饰器。装饰师是新来的
如果您使用的是Flask 0.8或更高版本,则在此请求后没有特定的功能。只有afterevery请求钩子,这是代码段用来处理每个请求回调的钩子
因此,除非您使用的是Flask 0.9或更新版本,否则您需要自己实现记录在案的挂钩:
@app.after_request
def per_request_callbacks(response):
for func in getattr(g, 'call_after_request', ()):
response = func(response)
return response
因此,钩子在每个请求之后运行,并查找钩子列表以在请求之后调用。after\u this\u request
decorator在那里注册了一个函数。只需从flask导入after\u request,就不需要修改after\u request或创建钩子
from flask import after_this_request
@after_this_request
def remove_file(response):
print('After request ...')
os.remove(filepath)
return response