亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號