我正在尝试在返回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
条款。
由于
答案 0 :(得分:0)
您在get
中的异常提出之前很久就已从reportgen_iterator
方法返回。
为什么?
应该给出一个迭代器,它将字符串作为内容。您 无法访问其内容,除非通过迭代响应对象 本身。这应该只在响应返回到时发生 客户端。
view函数返回迭代器(在你的情况下是生成器),但是当你仍在函数内部时,它不会被完全迭代。这就是为什么异常永远不会被get
方法捕获的原因。
https://docs.djangoproject.com/en/1.11/ref/request-response/#streaminghttpresponse-objects