django скачать файл csv по ссылке

Я новичок в django и python. Нужна помощь в этом поиске.

Случай: когда пользователь нажимает кнопку отправки в форме, должна отображаться страница успеха и ссылка, по которой он может загрузить результаты. Результаты в файле excel. Я могу создать вывод в файл excel с помощью модуля xlwt и отобразить страницу успеха по отдельности, но не одновременно.

Что у меня есть: я запускаю django1.1.1 на Windows XP с python 2.6. Был задан аналогичный вопрос, но он не смог заставить его работать.

моя страница успеха page.html имеет эту строку

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

URL.py:

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

просмотров.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

Когда я нажимаю на ссылку, она выдает ошибку пути

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'

Кстати, example.xls находится как в папке C:/example.xls, так и в статической папке.

Структура:

  • webdb
    • Static
      • example.xls
    • Webinput
      • urls.py
      • просмотры.py
      • модели.py

У меня тоже есть эти 2 модуля. Если я использую backup_to_csv, он работает нормально, но загружается напрямую без ссылки. Как сделать то же самое, когда у меня уже есть файл. Если есть другие способы, где мне не нужно хранить файл, это тоже нормально.

защита 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 (запрос, строка):

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

person user234850    schedule 18.12.2009    source источник


Ответы (3)


Теперь это работает, но мне пришлось изменить расширение файла с excel (.xls) на csv.

Мой urls.py=url(r'^static/example.txt', send_file)
Моя HTML-ссылка=<a href="../static/example.txt">Download CSV File</a>
Мой 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
person user234850    schedule 21.12.2009

В вашем urls.py измените

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

to

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

В первом вы также передаете все после / в представление как еще один параметр, но ваше представление не принимает этот параметр. другим вариантом было бы принять этот параметр в представлении:

def send_file(request, path):
    ...

но поскольку путь к вашему файлу xls жестко запрограммирован, я не думаю, что вам это нужно.

person Ofri Raviv    schedule 19.12.2009
comment
Спасибо, но выдает эту ошибку Traceback (последний последний вызов): Файл C:\Python26\lib\site-packages\django\core\servers\basehttp.py, строка 280, при запуске self.finish_response() Файл C:\ Python26\lib\site-packages\django\core\servers\basehttp.py, строка 319, в finish_response для данных в self.result: File C:\Python26\lib\site-packages\django\http_init_< /i>.py, строка 378, в следующем фрагменте = self._iterator.next() Файл C:\Python26\lib\site-packages\django\core\servers\basehttp.py, строка 50, в следующих данных = self .filelike.read(self.blksize) TypeError: требуется целое число - person user234850; 21.12.2009

В комментариях Офри Равив. Вы упомянули, что это дает вам

TypeError: целое число

это связано с тем, что при создании FileWrapper вы передаете два параметра, из которых второй [необязательный] должен быть целым числом, но вы передали 'rb'

оболочка = FileWrapper (файл (имя файла), «rb»)

Что на самом деле должно быть записано как («rb» - это параметр файла)

оболочка = FileWrapper (файл (имя файла, «rb»))

Так что это было просто смещение фигурных скобок, но иногда это затрудняет отладку.

person Bunny Rabbit    schedule 15.08.2012