2016-08-17 7 views
1

플라스크 앱으로 만든 파일을 사용자가 다운로드 한 후 파일을 삭제하고 싶습니다.flask :`@ after_this_request`이 작동하지 않습니다.

이렇게하면 answer on SO이 예상대로 작동하지 않고 after_this_request이 정의되지 않았 음을 알리는 오류가 발생했습니다.

나는 그 방법을 사용하는 방법에 대해 Flask's documentation providing a sample snippet에 대해 자세히 살펴 보았습니다. 따라서 샘플 코드에 표시된대로 after_this_request 함수를 정의하여 코드를 확장했습니다.

코드 실행 서버를 실행하면 예상대로 작동합니다.

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

내가 여기서 뭘 그리워 : @after_this_requestAfter request ... 터미널에서 플라스크의 출력으로 인쇄되지 않기 때문에 분명하다 호출되지 않습니다 때문에, 파일이 제거되지 않습니다? 파일을 사용자가 다운로드 한 후 삭제하기 위해 @after_this_request 데코레이터에 따라 함수를 호출하는 것을 어떻게 보장 할 수 있습니까?

참고 : 플라스크 버전 0.11.1

답변

1

사용은 플라스크에 요청 기능 후 특정 없습니다. 요청 후크에만 이 있으며 이는 스 니펫이 요청 당 콜백을 처리하기 위해 사용하는 것입니다.

당신은 후크 구현하지 않았다

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

은 그래서 훅이 각각의 모든 요청 후 실행하고 g.call_after_request에 전화 후크의 목록을 찾습니다됩니다. after_this_request 데코레이터는 거기에 함수를 등록합니다. 위의 훅이 없으면 after_this_request 데코레이터는 본질적으로 쓸모가 없습니다.

0

플라스크에서 after_this_request를 가져 오면 after_request를 수정하거나 후크를 만들 필요가 없습니다.

from flask import after_this_request 

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