django скачать csv файл по ссылке
Я новичок в django и python. Нужно руководство в этом поиске.
Case: когда пользователь нажимает кнопку отправить в форме, он должен отображать страницу успеха и ссылку, где они могут загрузить результаты. Результаты находятся в файле excel. Я могу создать вывод в файл excel с помощью модуля xlwt и отобразить страницу успеха по отдельности, но не одновременно.
что у меня есть: Я запускаю django1.1.1 в windows XP с python 2.6. Был похожий вопрос спросил но не смог заставить его работать.
моя страница успех.html имеет эту строку
<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
когда я нажимаю на ссылку, она дает пути ошибок
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'
пример BTW.xls находится в обоих местах C:/example - ... xls и в статическом папка
структура:
- webdb
- статический
- пример.в XLS
- Webinput
- urls.py
- views.py
- models.py
- статический
у меня есть эти 2 модуля. Если я использую backup_to_csv, он отлично работает, но он downlods напрямую без ссылки. Как сделать то же самое, когда у меня уже есть файл. Если есть другие способы, где мне не нужно хранить файл, это тоже хорошо.
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 (запрос,строка):
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
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
в вашем 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 жестко закодирован, я не думаю, что вам это нужно.
в комментариях Офри Равив. вы упомянули, что это дает вам
TypeError: целое число
Это потому, что при создании FileWrapper u передают два параметра, из которых второй[необязательно] должен быть целым числом, но u передал 'rb'
wrapper = FileWrapper(файл (имя файла),"rb")
который на самом деле должен быть записан как ('rb' - параметр для файла)
фантик = FileWrapper(файл (имя файла,"rb"))
таким образом, это было просто несоосность фигурных скобок, но иногда это затрудняет отладку.