2016-08-17 2 views
1

Ich möchte eine Datei löschen, nachdem der Benutzer eine Datei heruntergeladen hat, die von der Flask-App erstellt wurde.flask: `@ after_this_request` funktioniert nicht

Dafür habe ich diese answer on SO gefunden, die nicht wie erwartet funktioniert und einen Fehler ausgelöst hat, der besagt, dass after_this_request nicht definiert ist.

Aus diesem Grund hatte ich einen tieferen Einblick in Flask's documentation providing a sample snippet über die Verwendung dieser Methode. Also habe ich meinen Code erweitert, indem ich eine after_this_request-Funktion definiert habe, wie im Beispiel-Snippet gezeigt.

Ausführung des Codes resp. Das Ausführen des Servers funktioniert wie erwartet. Allerdings wird die Datei nicht entfernt, da @after_this_request wird nicht aufgerufen, die offensichtlich ist, da After request ... nicht zu Flask der Ausgabe im Terminal gedruckt wird:

#!/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) 

Was vermisse ich hier? Wie kann ich sicherstellen, dass die folgende Funktion zum @after_this_request Decorator aufgerufen wird, um die Datei zu löschen, nachdem sie vom Benutzer heruntergeladen wurde?

Hinweis: Die Verwendung Flask Version 0.11.1

Antwort

1

Es gibt keine spezifischen nach dieser Anfrage Funktionalität in Flask. Es gibt nur eine nach jede Anfrage Hook, das ist, was das Snippet coopts pro Anfrage Callbacks zu behandeln.

Sie haben den Haken nicht implementieren:

@app.after_request 
def per_request_callbacks(response): 
    for func in getattr(g, 'call_after_request',()): 
     response = func(response) 
    return response 

Damit Haken nach jedem Lauf wird und jede Anforderung und sucht nach einer Liste der Haken in g.call_after_request zu nennen. Der Dekorateur after_this_request registriert dort eine Funktion. Ohne den oben genannten Haken ist Ihr after_this_request Decorator im Wesentlichen nutzlos.

0

Importieren Sie einfach after_this_request von der Flasche, Sie müssen nicht nach after_request ändern oder einen Haken erstellen.

from flask import after_this_request 

@after_this_request 
def remove_file(response): 
    print('After request ...') 
    os.remove(filepath) 
return response 
Verwandte Themen