为了账号安全,请及时绑定邮箱和手机立即绑定

使用 django-wkhtmltopdf 生成时将 PDF 保存到磁盘

使用 django-wkhtmltopdf 生成时将 PDF 保存到磁盘

交互式爱情 2023-06-13 10:58:16
我要实现的是:用户将查询参数从 React FE 微服务发送到 Django BE 微服务。URI 类似于/api/reports?startingPage=12&dataView=Region这些 PDF 太大而无法在 FE 中生成,所以在服务器端生成请求进入从数据库中查询view.py相关数据的位置dataView=Region,遍历每一行并为每个项目生成一个 PDF 报告每个都dataView=Region可以包含几百个项目,每个项目都是自己的报告,可以是一页长或几页长随着报告的生成,它们应该被保存到服务器持久卷声明中,并且在它们全部运行之前不会被发送回 FE。当它们全部运行后,我计划将pypdf2所有 PDF 合并到一个大文件中。那时,文件被发送回 FE 进行下载。我目前只处理 1. 和 3.,我无法:获取要保存到存储的文件防止 PDF 生成后被发送回 FE 的默认行为正在生成 PDF,这很好。我正在尝试实施此处找到的建议,但没有得到预期的结果:将 pdf 从 django-wkhtmltopdf 保存到服务器(而不是作为响应返回)这是我目前在 Django 方面拥有的:# urls.pyfrom django.urls import pathfrom .views import GeneratePDFViewapp_name = 'Reports'urlpatterns = [    path('/api/reports',        GeneratePDFView.as_view(), name='generate_pdf'),]# views.pyfrom django.conf import settingsfrom django.views.generic.base import TemplateViewfrom rest_framework.permissions import IsAuthenticatedfrom wkhtmltopdf.views import PDFTemplateResponse# Create your views here.class GeneratePDFView(TemplateView):    permission_classes = [IsAuthenticated]    template_name = 'test.html'    filename = 'test.pdf'    def generate_pdf(self, request, **kwargs):        context = {'key': 'value'}        # generate response        response = PDFTemplateResponse(            request=self.request,            template=self.template_name,            filename=self.filename,            context=context,            cmd_options={'load-error-handling': 'ignore'})我应该注意另一个DOWNLOAD_ROOT,并且MEDIA_ROOT在应用程序使用它们的地方工作正常。我什至尝试过使用settings.MEDIA_ROOT因为我知道它有效,但仍然没有保存任何东西。但正如您所见,我从超级基础开始,没有添加查询、循环等。我的save_pdf()不同于我链接到的 SO 问题,因为那是我在我的应用程序的其他部分使用的,并且它在那里保存文件很好。我确实尝试了他们在 SO 问题中提供的内容,但结果相同,但没有保存。即:with open("file.pdf", "wb") as f:     f.write(response.rendered_content)那么我需要做什么才能将这些 PDF 保存到磁盘?也许我需要使用不同的库来满足我的需要,因为django-wkhtmltopdf似乎开箱即用了很多我不想做的事情,我不清楚我是否可以覆盖。
查看完整描述

1 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

好的,我光滑的大脑一夜之间起了一些涟漪,今天早上想通了:


# views.py


class GeneratePDFView(TemplateView):

    permission_classes = [IsAuthenticated]


    def get(self, request, *args, **kwargs):

        template_name = 'test.html'

        filename = 'test.pdf'

        context = {'key': 'value'}


        # generate response

        response = PDFTemplateResponse(

            request=request,

            template=template_name,

            filename=filename,

            context=context,

            cmd_options={'load-error-handling': 'ignore'})


        # write the rendered content to a file

        with open(settings.PDF_DIR + '/' + filename, "wb") as f:

            f.write(response.rendered_content)


        return HttpResponse('Hello, World!')

这将 PDF 保存到磁盘,也没有响应 PDF。显然是一个我可以扩展的最小功能示例,但至少解决了这两个问题。


查看完整回答
反对 回复 2023-06-13
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信