我正在制作视图以像这样在我的视图中列出数据
class DownloadView(ListView):
template_name = 'mytemplate.html'
现在在我的那个视图中,我希望当页面加载时我在那个视图中生成一个 pdf 文件(我可以这样做),然后它应该提示用户保存文件选项。我怎样才能做到这一点
查看django 文档,它显示填充response['Content-Disposition']
with 'attachment; filename="somefilename.pdf"'
,但我认为以下可能有效,如果您已将 pdf 文件数据读入pdf_data
.
from django.http import HttpResponse
def serve_pdf_view(request):
pdf_data = magically_create_pdf()
return HttpResponse(pdf_data, content_type='application/pdf')
我不建议在请求期间生成 PDF 或使用 Django 提供静态文件。
最好的办法是将所有 PDF 保存到一个文件夹并使用 Apache 或 Nginx 来提供它们并将内容类型标头设置为 application/octet-stream 以指示要保存响应。
- 编辑 -
我相信正确的解决方案是动态生成 PDF,但使用任务队列而不是在请求期间执行。如果您需要对请求 PDF 的用户进行身份验证和授权,请在 Django 中进行,但使用 X-Accel (nginx)、X-Sendfile (apache) - 或等效的 - 告诉您的网络服务器提供实际文件。
Django 不打算提供静态文件。引用 django 文档,“仅仅因为它可以,并不意味着它应该”。
在请求期间生成 PDF 不是一个好主意,因为它使用户等待,请求可以并且将会超时,长时间运行的请求会占用您的服务器,不耐烦的用户会(反复)刷新,最后,这是一个 DOS 攻击面。