我试着做一个按钮来下载 .xlsx
使用django创建文件,因此我遵循了本教程:https://xlsxwriter.readthedocs.io/example_django_simple.html
现在我有一个http响应,但没有显示下载提示。
以下是我的代码的一些部分:
views.py:
def xlsx(request):
if request.method == "POST":
output = io.BytesIO()
workbook = xlsxwriter.Workbook(output)
worksheet = workbook.add_worksheet("hello")
worksheet.write(0,0, 'Client')
workbook.close()
output.seek(0)
filename = 'EdedocBilling.xlsx'
response = HttpResponse(output, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)
return response
index.html
<form>...</form>
<button type = "button" id = "saveID"
onclick = "$.ajax({
type: 'POST',
url: 'xlsx',
async: false,
data: $('form').serialize(),
success : console.log(' Success')
})">
Generate
</button>
我删除了处理数据的代码,因为 .xlsx
很好(我测试了在服务器上创建文件的过程,结果成功了。)
以下是http响应头:
HTTP/1.1 200 OK
Date: Thu, 08 Jul 2021 14:47:37 GMT
Server: WSGIServer/0.2 CPython/3.8.8
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content-Disposition: attachment; filename="EdedocBilling.xlsx"
X-Frame-Options: DENY
Content-Length: 5252
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
有人有解决办法吗?谢谢
1条答案
按热度按时间f87krz0w1#
这是由于ajax的性质,以及浏览器如何处理所有这些问题。
看看问题的不同答案是否可以下载带有http post的文件?。
使用媒体和url模式
在post请求的响应中返回url,并实现传递文件内容的url模式。
这当然是一个多一点的努力,但这将是一个很好的解决方案,如果你的网站必须规模。
步骤:
为excel工作表创建django模型,并将生成的文件存储在介质文件夹中:请参阅https://docs.djangoproject.com/en/3.2/topics/files/ 关于如何做到这一点的细节。该模型至少应该有一个slug和一个file字段,如果您希望访问权限只是临时可用的,还可以有一个date字段来处理到期。
在URL.py中,创建一个用于标识特定excel的路由,例如/generated/slug:slug.xls。实施
get_absolute_url()
在您的模型上返回此路线。在post请求中,不要返回生成的文件,而是返回obj.get_absolute_url的结果,作为要在js中处理的文本内容。
在ajax成功处理程序中,将浏览器重定向到此url。
在此路由视图中,返回文件。您也可以在此处检查授权和到期。
在生产设置中,您还可以配置反向代理(如nginx)以交付文件,而django视图仅设置一个标头(x-accel-redirect),向代理指示要交付的文件。看见https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile/ 更多关于这方面的信息。