2009-12-18 3 views
7

Я новичок в django и python. Вам нужно руководствоваться этим заданием.django скачать csv файл по ссылке

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

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

мой успех page.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 example.xls находится в обоих местах, C: /example.xls и в статической папке

Структура:

  • WebDB
    • Статическая
      • example.xls
    • Webinput
      • urls.py
      • views.py
      • models.py

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

Защиту xls_to_response (XLS, имя_файла):

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

Защиту 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 

ответ

7

Теперь он работает, но мне пришлось изменить расширение файла с 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 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

В ваших URLs.р изменения

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

в

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

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

def send_file(request, path): 
    ... 

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

+0

Спасибо, но это дает эту ошибку Traceback (последний звонок последний): Файл "C: \ Python26 \ Lib \ сайт-пакеты \ Джанго \ ядро ​​\ серверов \ basehttp.py", строка 280, в перспективе self.finish_response() Файл "C: \ Python26 \ Lib \ сайт-пакеты \ Джанго \ ядро ​​\ серверов \ basehttp.py", строка 319, в finish_response для данных в self.result: Файл «C : \ Python26 \ lib \ site-packages \ django \ http \ __ init__.py ", строка 378, в следующем chunk = self._iterator.next() Файл" C: \ Python26 \ lib \ site-packages \ django \ core \ servers \ basehttp.py ", строка 50, в следующем data = self.filelike.read (self.blksize) ТипError: требуется целое число – user234850

1

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

TypeError: an integer

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

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

Какой должна быть фактически записана в виде ('гб' является параметром File)

обертка = FileWrapper (файл (имя файла, "Р.Б."))

так это было просто misali gretment braces, но иногда затрудняет отладку.

Смежные вопросы