2016-08-17 3 views
1

Я хочу удалить файл после того, как пользователь загрузил файл, созданный флеш-приложением.колба: `@ after_this_request` не работает

Для этого я нашел это answer on SO, который не работал должным образом и поднял ошибку, указав, что after_this_request не определен.

Из-за этого у меня был более глубокий взгляд на Flask's documentation providing a sample snippet о том, как использовать этот метод. Итак, я расширил свой код, определив функцию after_this_request, как показано в фрагменте примера.

Выполнение кода, соотв. работа сервера работает должным образом. Однако файл не удаляется, поскольку @after_this_request не называется, которая очевидна, так как After 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_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 
Смежные вопросы