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 не передает другие значения? Как это исправить?

Вернуться на верх