2016-11-28 7 views
4

を提供しています私はデータを生成し、CSVは、パンダでファイルとして保存フラスコを眺めることができ、そのデータを表示します。第2のビューは生成されたファイルを提供する。ダウンロードしたファイルを削除したい私の現在のコードは、それがsend_from_directoryで扱われる前にafter_requestは、ファイルを削除し、多分ので、パーミッションエラーが発生します。ファイルを提供した後でファイルを削除するにはどうすればよいですか?ビュー戻った後が、応答が送信される前に削除ファイルはそれを

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

誰もWebプログラミングのためにWindowsを使用することは、いつでも願っています。 ;-) –

関連する問題