Python Django提供下载文件

Python Django提供下载文件,python,django,file,download,Python,Django,File,Download,我试图提供一个txt文件生成的一些内容,我有一些问题。我创建了临时文件,并使用NamedTemporaryFile编写了内容,只需将delete设置为false即可调试,但下载的文件不包含任何内容 我猜响应值没有指向正确的文件,没有下载任何内容,以下是我的代码: f = NamedTemporaryFile() f.write(p.body) response = HttpResponse(FileWrapper(f), mimetype='application/fo

我试图提供一个txt文件生成的一些内容,我有一些问题。我创建了临时文件,并使用NamedTemporaryFile编写了内容,只需将delete设置为false即可调试,但下载的文件不包含任何内容

我猜响应值没有指向正确的文件,没有下载任何内容,以下是我的代码:

    f = NamedTemporaryFile()
    f.write(p.body)

    response = HttpResponse(FileWrapper(f), mimetype='application/force-download')
    response['Content-Disposition'] = 'attachment; filename=test-%s.txt' % p.uuid
    response['X-Sendfile'] = f.name

XSend需要中文件的路径
response['X-Sendfile']
那么,你能做什么

response['X-Sendfile'] = smart_str(path_to_file)
这里,
path\u to\u file
是文件的完整路径(不仅仅是文件名)
签出此您是否考虑过通过
响应发送
p.body
,如下所示:

response = HttpResponse(mimetype='text/plain')
response['Content-Disposition'] = 'attachment; filename="%s.txt"' % p.uuid
response.write(p.body)

您的方法可能存在几个问题:

  • 文件内容不必刷新,请添加上文注释中提到的
    f.flush()
  • NamedTemporaryFile
    在关闭时被删除,在您退出函数时可能会发生什么情况,因此Web服务器没有机会获取它
  • 临时文件名可能不在web服务器配置为使用
    X-Sendfile发送的路径中

也许使用而不是创建临时文件会更好,
X-Sendfile

不要忘记刷新文件:f.flush,在其他任何事情之前。有关使用Django提供文件的更多详细信息,请参阅:我已经修改了代码:“response['X-Sendfile']=smart_str(f.name)”但仍然没有,我需要使用f.name以外的东西吗?它需要完整路径,而不仅仅是
f.name
-除非您将绝对路径存储在
f.name
?NamedTemporary文件在Django 1.9中创建绝对路径,它应该是response=HttpResponse(p.body,content_type='text/plain');响应['Content-Disposition']='附件;filename=“%s.txt”'%p.uuid这是问题的正确答案,因为提供的是文本内容。许多想要提供二进制文件的人也来到这里。@Saurabh Chandra Patel的答案对于提供二进制文件很有用
import urllib2;   
url ="http://chart.apis.google.com/chart?cht=qr&chs=300x300&chl=s&chld=H|0"; 
opener = urllib2.urlopen(url);  
mimetype = "application/octet-stream"
response = HttpResponse(opener.read(), mimetype=mimetype)
response["Content-Disposition"]= "attachment; filename=aktel.png"
return response