Domanda

Sono un nuovo a Django e Python. Hai bisogno di una guida in questa ricerca.

Caso: Quando l'utente preme il pulsante di invio in un modulo, dovrebbe visualizzare la pagina Il successo e un link dove è possibile scaricare i risultati. I risultati sono in file excel. Posso creare output di eccellere file utilizzando il modulo xlwt e visualizzare la pagina di successo individuale, ma non entrambi allo stesso tempo.

Quello che ho: Sono in esecuzione django1.1.1 su Windows XP con Python 2.6. C'è stato chiesto domanda simile  ma non era in grado di farlo funzionare.

il mio successo page.html ha questa riga

<a href="../static/example.xls">Download CSV File</a>

urls.py:

url(r'^static/(?P<path>.*)$', send_file), 

views.py:

def send_file(request):

import os, tempfile, zipfile
from django.core.servers.basehttp import FileWrapper

"""                                                                         
Send a file through Django without loading the whole file into              
memory at once. The FileWrapper will turn the file object into an           
iterator for chunks of 8KB.                                                 
"""
filename = "C:/example.xls" # Select your file here.                                
wrapper = FileWrapper(file(filename),"rb")
response = HttpResponse(wrapper, content_type='text/plain')
#response['Content-Length'] = os.path.getsize(filename)
return response

Quando clicco sul link, si dà l'errore percorso

send_file() got an unexpected keyword argument 'path'
Request Method: GET
Request URL:    localhost:8000/webinput/static/example.xls
Exception Type: TypeError
Exception Value:    
send_file() got an unexpected keyword argument 'path'

A proposito example.xls è ad entrambe le posizioni C: /example.xls e nella cartella static

Struttura:

  • WebDB
    • Static
      • example.xls
    • Webinput
      • urls.py
      • views.py
      • models.py

Non ho questi 2 moduli. Se io uso backup_to_csv funziona benissimo ma downlods direttamente senza il collegamento. Come fare lo stesso quando ho già un file. Se ci sono altri modi in cui non devo file dell'archivio, va bene anche.

def xls_to_response (xls, fname):

response = HttpResponse(mimetype="application/ms-excel")
response['Content-Disposition'] = 'attachment; filename=%s' % fname
xls.save(response)
return response

def backup_to_csv (richiesta, riga):

response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename="backup.csv"'
writer = csv.writer(response, dialect='excel')    
#code for writing csv file go here...
for i in row:
    writer.writerow(i)
return response
È stato utile?

Soluzione

Ora funziona, ma ho dovuto cambiare estensione del file da Excel (.xls) in formato CSV.

Il mio urls.py = url(r'^static/example.txt', send_file)
Il mio collegamento HTML = <a href="../static/example.txt">Download CSV File</a>
Il mio view.py

def send_file(request):

  import os, tempfile, zipfile
  from wsgiref.util import FileWrapper
  from django.conf import settings
  import mimetypes

  filename     = "C:\ex2.csv" # Select your file here.
  download_name ="example.csv"
  wrapper      = FileWrapper(open(filename))
  content_type = mimetypes.guess_type(filename)[0]
  response     = HttpResponse(wrapper,content_type=content_type)
  response['Content-Length']      = os.path.getsize(filename)    
  response['Content-Disposition'] = "attachment; filename=%s"%download_name
  return response

Altri suggerimenti

Nel vostro urls.py cambi il tempo

urls.py url(r'^static/(?P.*)$', send_file)

a

urls.py url(r'^static/example.xls$', send_file)

Nella prima, si sta anche passando tutto dopo l'/ alla vista come un altro parametro, ma la vostra vista non l'accetta questo parametro. Un'altra opzione potrebbe essere quella di accettare questo parametro nella vista:

def send_file(request, path):
    ...

ma dal momento che il percorso per il file xls è codificato duro, io non credo che si bisogno di questo.

Nei commenti Ofri Raviv. lei ha detto che la sua dando un

  

TypeError: un intero

che è perché durante la creazione FileWrapper u stanno passando due parametri di cui la seconda [opzionale] dovrebbe essere un intero, ma u superato 'rb'

  

involucro = FileWrapper (file (nome file), "rb")

Che dovrebbe in realtà essere scritto come ( 'rb' è il parametro su file)

involucro = FileWrapper (file (nome file, "rb"))

Così è stato solo un disallineamento di parentesi graffe, ma rende difficile eseguire il debug di volte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top