Výhodný způsob pro stahování souboru generovaného za běhu v baňce

hlasů
14

Mám stránku, která zobrazuje seznam souborů v adresáři. Když uživatel klikne na tlačítko Stáhnout, všechny tyto soubory jsou na zip do jednoho souboru, který je poté nabídnuta ke stažení. Vím, jak poslat tento soubor do prohlížeče při klepnutí na tlačítko, a vím, jak se znovu načíst aktuální stránku (nebo přesměrovat na jiný), ale je možné dělat obojí v jednom kroku? Nebo že by větší smysl pro přesměrování na jinou stránku s odkazem pro stažení?

Moje stahování se zahájí s Flask API send_from_directory. Odpovídající zkušební kód:

@app.route('/download', methods=['GET','POST'])
def download():
    error=None
    # ...

    if request.method == 'POST':
        if download_list == None or len(download_list) < 1:
            error = 'No files to download'
        else:
            timestamp = dt.now().strftime('%Y%m%d:%H%M%S')
            zfname = 'reports-' + str(timestamp) + '.zip'
            zf = zipfile.ZipFile(downloaddir + zfname, 'a')
            for f in download_list:
                zf.write(downloaddir + f, f)
            zf.close()

            # TODO: remove zipped files, move zip to archive

            return send_from_directory(downloaddir, zfname, as_attachment=True)

    return render_template('download.html', error=error, download_list=download_list)

Aktualizace: Jako dočasné řešení, nyní jsem načtení nové stránky s tlačítkem myši, která uživateli umožňuje zahájit stahování (pomocí send_from_directory) před návratem do aktualizovaného seznamu.

Položena 23/03/2011 v 20:02
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
7

Utíkáte do baňky aplikaci za přední koncové webový server, jako je Nginx nebo apache (což by bylo nejlepší způsob, jak zvládnout stahování souborů). Pokud používáte Nginx můžete použít na ‚X-Accel-redirect‘ záhlaví. V tomto příkladu budu používat adresář /srv/static/reportsjako adresář jste vytváření distribučních .zip archivů dovnitř a chtějí jim sloužit mimo.

nginx.conf

v serveroddíle

server {
  # add this to your current server config
  location /reports/ {
    internal;
    root /srv/static;
  }
}

Vaše metoda baňka

poslat hlavičku Nginx na server

from flask import make_response
@app.route('/download', methods=['GET','POST'])
def download():
    error=None
    # ..
    if request.method == 'POST':
      if download_list == None or len(download_list) < 1:
          error = 'No files to download'
          return render_template('download.html', error=error, download_list=download_list)
      else:
          timestamp = dt.now().strftime('%Y%m%d:%H%M%S')
          zfname = 'reports-' + str(timestamp) + '.zip'
          zf = zipfile.ZipFile(downloaddir + zfname, 'a')
          for f in download_list:
              zf.write(downloaddir + f, f)
          zf.close()

          # TODO: remove zipped files, move zip to archive

          # tell nginx to server the file and where to find it
          response = make_response()
          response.headers['Cache-Control'] = 'no-cache'
          response.headers['Content-Type'] = 'application/zip'
          response.headers['X-Accel-Redirect'] = '/reports/' + zf.filename
          return response

Pokud používáte Apache, můžete použít své směrnici sendfile http://httpd.apache.org/docs/2.0/mod/core.html#enablesendfile

Odpovězeno 28/03/2011 v 19:06
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more