[英]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,最好將這些任務從響應流中刪除。 這會產生許多其他問題,您需要弄清楚,但它看起來像這樣:
如果您的計算機沒有達到要求,或者您的用戶負擔太大,以致您無法在請求超時之前生成PDF,那么您應該使用Celery,但是許多PDF可以快速而簡單地生成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.