Python Django-使用相同的类实例返回Pdf和JsonResponse
我有一个返回JsonResponse的视图。我想使用Building实例(结构变量)生成pdf报告 例如,返回JsonResponse的视图是:Python Django-使用相同的类实例返回Pdf和JsonResponse,python,django,Python,Django,我有一个返回JsonResponse的视图。我想使用Building实例(结构变量)生成pdf报告 例如,返回JsonResponse的视图是: @login_required def buildings(request): if request.POST and request.is_ajax(): s_form = BuildingForm(request.POST) if s_form.is_valid():
@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意味着一个新的建筑实例。除了使用另一个视图解决问题之外,还有另一个解决方案
在前端,我想显示JsonResponse,并让用户可以使用html按钮下载pdf
用芹菜做这项工作合适吗
提前谢谢 如果您想使用同一个视图发送两种不同的格式,这是非常好的,事实上,许多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)
您可以使用如下视图来解析此内容:
/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)
现在,关于使用芹菜:当你知道任务将占用机器很长一段时间,比如创建一个繁重的PDF时,最好将这些任务从响应流中删除。这会产生许多其他问题,您需要解决,但它看起来是这样的:
/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)
如果您的计算机无法满足要求,或者您的用户负载太大,无法在请求超时之前生成PDF,那么您应该使用芹菜,但许多PDF可以快速而简单地生成。感谢您的回复。关于答案的第一部分,我有一个问题。代码可以选择生成pdf或html。如果我为html调用view函数,然后为pdf调用该类两次,并生成两次结果?这就是结果在浏览器中的显示方式。关于答案的第二部分,我将调查芹菜的使用情况。我现在可以延迟视图中的任务,但是以后如何使用图像中显示的按钮调用?从url引用其他视图?-首先:如果向视图发送两个请求,视图将生成两个响应,HTTP是无状态协议,您有责任缓存您希望在两个响应之间共享的任何中间结果-第二:您可能需要编写另一个视图来检查状态(这将输出任务的状态),以及另一个视图来请求文件,这将处理内容处理头以下载文件,这些问题完全不同。我理解,我想我会尝试芹菜。再次感谢。