以Django作为附件输出PDF并重新加载
我正在使用django生成pdf,并将响应作为附件返回到视图中以Django作为附件输出PDF并重新加载,django,pdf-generation,reload,Django,Pdf Generation,Reload,我正在使用django生成pdf,并将响应作为附件返回到视图中 response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename=somefilename.pdf' 与文档中描述的方式类似) 重新加载页面的最佳方式是什么 这不起作用(表单触发pdf生成): 非常感谢, Danny不要重新加载。而是创建一个作为表单目标的视图。视图在一个目录中生成P
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'
与文档中描述的方式类似)
重新加载页面的最佳方式是什么
这不起作用(表单触发pdf生成):
非常感谢,
Danny不要重新加载。而是创建一个作为表单目标的视图。视图在一个目录中生成PDF,该目录从真实的web服务器发送,然后将用户发送到相应的URL,用户可以在那里下载文件(使用HttpResponseRedirect)。不要重新加载。而是创建一个作为表单目标的视图。视图在一个目录中生成PDF,该目录从真实的web服务器发送,然后将用户发送到相应的URL,用户可以在那里下载文件(使用HttpResponseRedirect)。只需将表单目标设置为生成PDF的视图即可。下面我介绍了这种方法与Martin建议的方法(将文件写入世界可以读取的目录)的一些优缺点 优点:
- 您可以进行身份验证或特殊计费或其他任何操作
- 每个请求都将生成一个新的PDF(除非您显式缓存它)
- 每个请求将生成一个新的PDF
- 内存使用
- 您必须从Django流式传输文件
另一个解决方案是使用Web服务器的X-SendFile头。在谷歌上搜索特定服务器的说明。一般的想法是,视图为Web服务器提供一个文件路径,然后Web服务器将直接从磁盘读取该文件并返回给用户。您甚至可以“强制下载”这些文件,查看Web服务器的文档,了解如何进行下载。只需将表单目标设置为生成pdf的视图即可。下面我介绍了这种方法与Martin建议的方法(将文件写入世界可以读取的目录)的一些优缺点 优点:
- 您可以进行身份验证或特殊计费或其他任何操作
- 每个请求都将生成一个新的PDF(除非您显式缓存它)
- 每个请求将生成一个新的PDF
- 内存使用
- 您必须从Django流式传输文件
另一个解决方案是使用Web服务器的X-SendFile头。在谷歌上搜索特定服务器的说明。一般的想法是,视图为Web服务器提供一个文件路径,然后Web服务器将直接从磁盘读取该文件并返回给用户。您甚至可以“强制下载”这些文件,请查看Web服务器的文档,了解如何进行下载。谢谢Martin。这是一个很好的选择。是否仍然可以将PDF作为附件返回?我决定实施Martin建议的方法。谢谢你,谢谢马丁。这是一个很好的选择。是否仍然可以将PDF作为附件返回?我决定实施Martin建议的方法。谢谢。我将表单目标发送到生成pdf的视图,并获取附件作为响应
def some_view(请求):response=HttpResponse(mimetype='application/pdf')response['Content-Disposition']='附件;filename=somefilename.pdf'。。。返回响应
,但返回响应后页面不会重新加载。Aha。我懂了。好的,当您使用javascript在表单提交上执行操作时,它将在表单实际提交之前运行,因此您不能在那里进行任何重新加载或重定向。我能想到的最简单的解决方案是在提交处理程序中调用window.setTimeout(function(){window.location='/your/url/'},timeout_in_毫秒),但这确实是一个相当难看的黑客行为。我将表单目标发送到生成pdf的视图,并将附件作为响应def some_view(请求):response=HttpResponse(mimetype='application/pdf')response['Content-Disposition']='附件;filename=somefilename.pdf'。。。返回响应
,但返回响应后页面不会重新加载。Aha。我懂了。好的,当您使用javascript在表单提交上执行操作时,它将在表单实际提交之前运行,因此您不能在那里进行任何重新加载或重定向。我能想到的最简单的解决方案是在提交处理程序中调用window.setTimeout(function(){window.location='/your/url/'},timeout(以毫秒为单位)),但这确实是一个相当丑陋的攻击。
$('#the_form').submit(function(){
location.reload();
});