2015-03-22 17 views
7

Ho un sito Web basato su Flask in cui gli utenti possono scaricare alcuni file PDF.Come eseguire il codice dopo Flask send_file() o send_from_directory()

Questo è semplice da implementare utilizzando Flask's send_file() e send_from_directory().

Ad esempio:

@app.route('/downloadreport') 
def download_report(): 
    return send_from_directory(
     '/reports', 
     'my_report.pdf', 
     as_attachment=True) 

mi piacerebbe eseguire una logica (chiamiamolo after_download()) DOPO completato il download.

Ho provato a utilizzare il gancio @after_this_request. Ma sembra che send_file() venga eseguito in modo asincrono, pertanto @after_this_request potrebbe attivarsi prima del download del file.

  • Ad esempio, se il file è molto grande, un download potrebbe richiedere un po 'così @after_this_request sembra sparare mentre il file viene scaricato.
  • Sembra da the documentation come send_file() utilizza il file wrapper WSGI per effettuare il download ... forse è per questo che viene eseguito in modo asincrono?

C'è un modo per chiamare after_download() in modo che sia garantito per correre dietro send_file() ha completato l'invio del file ad un utente?

risposta

4

Non è possibile. Mentre send_file esegue lo streaming del file utilizzando Flask quando si utilizza il server di sviluppo, è possibile (e davvero dovrebbe essere necessario per le prestazioni) utilizzare il server Web (nginx, apache, ecc.) E X-SendFile in produzione. Dal momento che il server web è fuori dal controllo dell'applicazione, sei sfortunato.

Problemi correlati