2009-12-18 50 views
7

Soy nuevo en django y python. Necesito alguna guía en esta búsqueda.django descarga el archivo csv usando un enlace

Caso: cuando el usuario pulsa el botón de enviar en un formulario, debe mostrar la página de éxito y un enlace donde pueden descargar los resultados. Los resultados están en archivo Excel. Puedo crear un archivo de salida a Excel usando el módulo xlwt y mostrar la página de éxito de forma individual, pero no ambas al mismo tiempo.

Lo que tengo: Estoy ejecutando django1.1.1 en Windows XP con Python 2.6. Hubo una pregunta similar al pero no fue posible.

mi éxito pagina.html tiene esta línea de

<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 

Cuando hago clic en el enlace, se da error de ruta

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' 

Por cierto example.xls es tanto a localizaciones C: /example.xls y en la carpeta estática

Estructura:

  • WebDB
    • estático
      • example.xls
    • Webinput
      • urls.py
      • views.py
      • models.py

tengo estos 2 módulos también. Si uso backup_to_csv funciona bien, pero se descarga directamente sin el enlace. Cómo hacer lo mismo cuando ya tengo un archivo. Si hay otras formas en que no tengo que almacenar el archivo, eso también está bien.

xls_to_response def (xls, fname):

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

def backup_to_csv (solicitud, fila):

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 

Respuesta

7

Ahora funciona pero tuve que cambiar la extensión de archivo de excel (.xls) a csv.

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

def send_file(request): 

    import os, tempfile, zipfile 
    from django.core.servers.basehttp 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 
2

en sus URL.py cambio

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

a

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

En el primero, también está de paso que sigue/a la vista como otro parámetro, pero su vista no lo acepta este parámetro. otra opción sería aceptar este parámetro en la vista:

def send_file(request, path): 
    ... 

pero desde la ruta a su archivo XLS está codificado, no creo que usted necesita.

+0

Gracias pero da este error Rastreo (llamada más reciente pasado): archivo "C: \ Python26 \ lib \ site-packages \ Django \ core \ servers \ basehttp.py", línea 280, en ejecución self.finish_response() archivo "C: \ Python26 \ lib \ site-packages \ Django \ core \ servers \ basehttp.py", línea 319, en finish_response de datos en self.result: archivo "C : \ Python26 \ lib \ site-packages \ django \ http \ __ init__.py ", línea 378, en el siguiente chunk = self._iterator.next() Archivo" C: \ Python26 \ lib \ site-packages \ django \ core \ servers \ basehttp.py ", línea 50, en el siguiente data = self.filelike.read (self.blksize) TypeError: se requiere un número entero – user234850

1

En los comentarios Ofri Raviv. usted ha mencionado que su dándole un

TypeError: an integer

que es debido al crear FileWrapper U están pasando dos parámetros, de los cuales el segundo [opcional] se supone que debe ser un número entero, pero u pasó 'rb'

wrapper = FileWrapper(file(filename),"rb")

que en realidad debería ser escrito como ('rb' es el parámetro a File)

envoltorio = FileWrapper (archivo (nombre de archivo, "rb"))

Así que era sólo un Misali gnmento de llaves, pero hace que sea difícil depurar a veces.

Cuestiones relacionadas