Django StreamingHttpResponse возвращает только один результат выхода из генератора в поток
Я пытаюсь передать несколько больших json файлов на front end одновременно (мне нужно передать их все по одному, и я не могу разделить это на несколько запросов):
def stream_response_generator(response):
yield json.dumps({ 'searchedVariants': response['searchedVariants']})
yield json.dumps({ 'genesById': response['genesById']})
yield json.dumps({ 'locusListsByGuid': response['locusListsByGuid']})
yield json.dumps({ 'genesQcData': response['genesQcData']})
@login_required(login_url=API_LOGIN_REQUIRED_URL)
@csrf_exempt
@log_request(name='query_variants_handler')
def query_variants_handler(request, search_hash):
...
return StreamingHttpResponse(stream_response_generator(response), content_type='application/octet-stream')
<<<Только самый первый ответ передается на фронтэнд, но остальные 3 ответа пропускаются. Я проверил распечатку ответа на фронтенде:searchedVariants
fetch(url, {
method: 'POST',
credentials: 'include',
body: JSON.stringify(search),
signal: signal,
}).then((response) => {
const reader = response.body.getReader()
let decoder = new TextDecoder('utf8');
let read
reader.read().then(read = (result) => {
if (result.done) return
let chunk = decoder.decode(result.value);
console.log(chunk)
reader.read().then(read)
})
})
В некоторых учебниках, например
https://andrewbrookins.com/django/how-does-djangos-streaminghttpresponse-work-exactly/
Написано, что мы должны передать генератор функций вместо вызова функции, как я делаю, однако, когда я это делаю:
def stream_response_generator(response):
def generator():
yield json.dumps({ 'searchedVariants': response['searchedVariants']})
yield json.dumps({ 'genesById': response['genesById']})
yield json.dumps({ 'locusListsByGuid': response['locusListsByGuid']})
yield json.dumps({ 'genesQcData': response['genesQcData']})
return generator
@login_required(login_url=API_LOGIN_REQUIRED_URL)
@csrf_exempt
@log_request(name='query_variants_handler')
def query_variants_handler(request, search_hash):
...
return StreamingHttpResponse(stream_response_generator(response), content_type='application/octet-stream')
Я получаю ошибку:
2022-10-21 03:34:28,165 ERROR: Traceback (most recent call last):
File "/site-packages/django/core/handlers/base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/python3.6/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/gris/decorators.py", line 26, in wrapper
return f(request, *args, **kwargs)
File "/variant_search_api.py", line 141, in query_variants_handler
return StreamingHttpResponse(stream_response_generator(response), content_type='application/octet-stream')
File "/python3.6/site-packages/django/http/response.py", line 367, in __init__
self.streaming_content = streaming_content
File "/python3.6/site-packages/django/http/response.py", line 382, in streaming_content
self._set_streaming_content(value)
File "/python3.6/site-packages/django/http/response.py", line 386, in _set_streaming_content
self._iterator = iter(value)
TypeError: 'function' object is not iterable
Я подозреваю, что это как-то связано с декоратором @csrf_exempt
, но не уверен. Итак, почему StreamingHttpResponse
не передает другие значения? Как это исправить?