Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶:`@在此请求之后`不工作_Python_Python 3.x_Flask_Request_Delete File - Fatal编程技术网

Python 烧瓶:`@在此请求之后`不工作

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

我想在用户下载由flask应用程序创建的文件后删除一个文件

为此,我发现这并没有如预期的那样工作,并引发了一个错误,告诉您此请求后的
未定义

因此,我对如何使用该方法进行了更深入的研究。因此,我扩展了代码,在这个请求之后定义了一个
函数,如示例代码段所示

分别执行代码。运行服务器可以按预期工作。但是,文件不会被删除,因为在请求之后,
@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