Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-使用相同的类实例返回Pdf和JsonResponse_Python_Django - Fatal编程技术网

Python Django-使用相同的类实例返回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():

我有一个返回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():
                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,那么您应该使用芹菜,但许多PDF可以快速而简单地生成。

    感谢您的回复。关于答案的第一部分,我有一个问题。代码可以选择生成pdf或html。如果我为html调用view函数,然后为pdf调用该类两次,并生成两次结果?这就是结果在浏览器中的显示方式。关于答案的第二部分,我将调查芹菜的使用情况。我现在可以延迟视图中的任务,但是以后如何使用图像中显示的按钮调用?从url引用其他视图?-首先:如果向视图发送两个请求,视图将生成两个响应,HTTP是无状态协议,您有责任缓存您希望在两个响应之间共享的任何中间结果-第二:您可能需要编写另一个视图来检查状态(这将输出任务的状态),以及另一个视图来请求文件,这将处理内容处理头以下载文件,这些问题完全不同。我理解,我想我会尝试芹菜。再次感谢。