簡體   English   中英

Django-使用相同的類實例返回Pdf和JsonResponse

[英]Django - Return Pdf and JsonResponse using same class instance

我有一個返回JsonResponse的觀點。 我想使用Building實例(structure變量)生成pdf報告。

例如,返回JsonResponse的視圖是:

   @login_required
    def buildings(request):
        if request.POST and request.is_ajax():
            s_form = BuildingForm(request.POST)
            if s_form.is_valid():
                structure = Building(**s_form.cleaned_data)
                html = render_to_string('wind/results/buildings/buildings_results.html', {'structure': structure})
                return JsonResponse({"result": html})
            else:
                return JsonResponse({'building_errors': s_form.errors,
                                    status=400)
        else:
            s_form = BuildingForm()
            return render(request, 'wind/buildings.html', {'s_form': s_form})

我有以下代碼用於生成並返回pdf:

    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="Report.pdf"'
    buffer = BytesIO()
    report = BuildingsReport(structure)  # I want to use the same Building instance
    pdf = report.generate_pdf()
    response.write(pdf)
    return response

我想要的是使用相同的建築實例來生成pdf和html變量。

使用其他視圖返回pdf意味着一個新的Building實例。 除了有另一種解決方案可以使用其他視圖解決問題之外。

在前端中,我想顯示JsonResponse並提供pdf供用戶使用html按鈕下載。

提倡使用芹菜來完成此任務?

提前致謝!

如果您想使用同一視圖發送兩種不同的格式,那是完全可以的,實際上,許多API都可以讓您選擇要接收哪種格式,例如:

/buildings?format=pdf

您可以使用以下視圖解析此內容:

def buildings(request):
    format = request.GET.get('format', 'html').lower() # HTML is the default method
    if format is 'pdf':
        return create_PDF_response(request) # create your PDF
    elif format is 'json':
        return carry_on_with_JSON_response(request)
    return the_default_HTML_response(request)

現在,關於使用Celery:當您知道任務將長時間占用計算機時,例如創建沉重的PDF,最好將這些任務從響應流中刪除。 這會產生許多其他問題,您需要弄清楚,但它看起來像這樣:

  1. 接收創建PDF的請求
  2. 創建一個celery任務,並在模型或某處保存某種狀態。
  3. 發回答復說正在創建PDF。
  4. 開始輪詢任務狀態...
  5. 完成芹菜任務后,更改模型的狀態或其他任何狀態。
  6. 停止輪詢並通知用戶該文件已准備好下載。
  7. 以某種方式將用戶帶到下載位置,最好使用按鈕,因為不是用戶交互產物的任何類型的下載都被許多瀏覽器視為攻擊。

如果您的計算機沒有達到要求,或者您的用戶負擔太大,以致您無法在請求超時之前生成PDF,那么您應該使用Celery,但是許多PDF可以快速而簡單地生成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM