我是django和python的新手。在这个任务中需要一些指导。
案例:当用户点击表单上的提交按钮时,它应显示“成功”页面和可以下载结果的链接。结果在excel文件中。我可以使用xlwt模块创建输出到excel文件并单独显示成功页面,但不能同时显示两者。
我有什么: 我正在使用python 2.6在Windows XP上运行django1.1.1。有类似的问题 但是无法使其发挥作用。
我的成功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和静态文件夹
结构:
我也有这两个模块。如果我使用backup_to_csv它工作正常但它没有链接直接下载。当我已有文件时如何做同样的事情。如果还有其他方法我不需要存储文件,那也没关系。
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(request,row):
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
答案 0 :(得分:9)
现在它可以工作但我必须将文件扩展名从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
答案 1 :(得分:2)
在你的urls.py中 变化
urls.py url(r'^static/(?P.*)$', send_file)
到
urls.py url(r'^static/example.xls$', send_file)
在第一个中,您还将/之后的所有内容作为另一个参数传递给视图,但您的视图不接受此参数。另一个选择是在视图中接受此参数:
def send_file(request, path):
...
但由于xls文件的路径是硬编码的,我认为你不需要它。
答案 2 :(得分:1)
在Ofri Raviv的评论中。你提到它给你一个
TypeError:一个整数
这是因为在创建FileWrapper时你传递了两个参数,其中第二个[可选]应该是整数但是你通过'rb'
wrapper = FileWrapper(file(filename),“rb”)
实际应该写为('rb'是文件的参数)
wrapper = FileWrapper(file(filename,“rb”))
所以这只是一个大括号的错位,但有时很难调试。