2016-11-28 3 views
4

У меня есть окно Flask, которое генерирует данные и сохраняет их как CSV-файл с Pandas, а затем отображает данные. Второе представление обслуживает сгенерированный файл. Я хочу удалить файл после его загрузки. Мой текущий код вызывает ошибку разрешения, возможно, потому, что after_request удаляет файл перед его подачей с send_from_directory. Как я могу удалить файл после его обслуживания?Удалить файл после того, как Flask его обслуживает

def process_data(data) 
    tempname = str(uuid4()) + '.csv' 
    data['text'].to_csv('samo/static/temp/{}'.format(tempname)) 
    return file 

@projects.route('/getcsv/<file>') 
def getcsv(file): 
    @after_this_request 
    def cleanup(response): 
     os.remove('samo/static/temp/' + file) 
     return response 

    return send_from_directory(directory=cwd + '/samo/static/temp/', filename=file, as_attachment=True) 

ответ

3

after_request работает после видовых возвращается, но прежде, чем ответ посылается. Отправка файла может использовать потоковый ответ; если вы удалите его, прежде чем он будет полностью прочитан, вы можете столкнуться с ошибками.

Прочитайте файл в память и подайте его, чтобы он не читался, когда вы удаляете его позже. В случае, если файл слишком большой для чтения в память, используйте генератор для его обслуживания, а затем удалите его.

@app.route('/download_and_remove/<filename>') 
def download_and_remove(filename): 
    path = os.path.join(current_app.instance_path, filename) 

    def generate(): 
     with open(path) as f: 
      yield from f 

     os.remove(path) 

    r = current_app.response_class(generate(), mimetype='text/csv') 
    r.headers.set('Content-Disposition', 'attachment', filename='data.csv') 
    return r 
+0

Технически, учитывая у вас есть открытый файловый объект, открытый на нем, вы можете удалить файл из файловой системы перед первым выходом в UNIX-прежнему будет держать файл вокруг, пока процесс до сих пор его открытым, несмотря на то, запись в каталоге файловой системы отсутствует. Конечно, это зависит от того, хотите ли вы удалить файл только в том случае, если вы достаточно уверены в том, что его все отправили, или если он был временным файлом и всегда хочет его удалить, даже если в какой-то момент его возврат не выполняется. –

+0

@GrahamDumpleton Я предполагаю, что проблема в Windows, и я помню, что не работал с операциями над открытыми файлами. – davidism

+1

Мы всегда можем надеяться, что никто никогда не использует Windows для веб-программирования. ;-) –

Смежные вопросы