django StreamingHttpResponse - 捕获在streaming_content迭代器中引发的异常

时间:2017-06-07 10:53:59

标签: python django iterator django-views chunked

我正在尝试在返回StreamingHttpResponse时处理错误:

在用作straeming_content的迭代器中手动引发的异常未被捕获。

这是代码:

def reportgen_iterator(request, object_id):
    output_format = request.GET.get('output', 'pdf')
    debug_mode = request.GET.get('debug', False)
    response_data = {
        'progress': 'Retrieving data...',
    }
    # code....
    yield json.dumps(response_data)

    # code ...
    raise Exception('bla bla') # manually raised exception

    # other code ......
    yield json.dumps(response_data)



class StreamingView(View):
    def get(self, request, object_id):
        """
        """
        stream = reportgen_iterator(request, object_id)
        try:
            response = StreamingHttpResponse(
                streaming_content=stream, status=200,
                content_type='application/octet-stream'
            )
            response['Cache-Control'] = 'no-cache'
            return response
        except Exception as e:
            # exception not catched
            return HttpResponseServerError(e.message)

有关如何正确处理此问题的任何帮助?永远不会达到except条款。

由于

1 个答案:

答案 0 :(得分:0)

您在get中的异常提出之前很久就已从reportgen_iterator方法返回。

为什么?

  

应该给出一个迭代器,它将字符串作为内容。您   无法访问其内容,除非通过迭代响应对象   本身。这应该只在响应返回到时发生   客户端。

view函数返回迭代器(在你的情况下是生成器),但是当你仍在函数内部时,它不会被完全迭代。这就是为什么异常永远不会被get方法捕获的原因。

https://docs.djangoproject.com/en/1.11/ref/request-response/#streaminghttpresponse-objects