ValueError: Представление test_app.views.sse_stream не вернуло объект HttpResponse. Вместо этого оно вернуло незапланированный корутин

В этом разделе я размещу полную версию ошибки, так как в разделе "title" есть ограничение на размер символов. Вот она: ValueError: Представление test_app.views.sse_stream не вернуло объект HttpResponse. Вместо этого оно вернуло не ожидаемый корутин. Возможно, вам нужно добавить 'await' в ваше представление.

Я пытаюсь использовать SSE (server sent event) для обновления некоторых данных из моей базы данных в реальном времени (я использую фреймворк Django). Это не работает, так как я получаю упомянутую выше ошибку. Неважно, что я пробовал, я все равно получаю ту же ошибку. Вот мой вид и функция, которую я использую для получения данных из базы данных: `

@sync_to_async
def retrievenotes(id_request):
    #logging.logger.debug(f"Retrieving notes for id_request: {id_request}")
    notes = Note.objects.filter(random_id=id_request).order_by('-created_at')
    return list(notes)
@csrf_exempt
async def sse_stream(request, username):
    """
    Sends server-sent events to the client.
    """
    #logging.logger.debug("Starting sse_stream")
    async def event_stream():
        while True:
            # Call the sync function asynchronously
            notes = await retrievenote('wCgS8VVO0UY8fb4mAv0A')
            notes_str = "".join([f"Note created at: {note.created_at}, Note text: {note.text}<br>" for note in notes])
            
            yield await f"data: {notes_str}\n\n"
            
            await asyncio.sleep(1)

    # Convert the async generator to an async iterator
    async def async_iterator_wrapper(async_gen):
        async for item in async_gen:
            yield await item

    return StreamingHttpResponse(async_iterator_wrapper(event_stream()), content_type='text/event-stream')

`

А вот код javascript: `

<script>
        let eventSource;
        const sseData = document.getElementById('notestext');

        function startSSE() {
            var currentUrl = window.location.href;
            console.log("Current URL: " + currentUrl);
            
            // Construct the correct EventSource URL by appending '/stream/' to the base URL
            const eventSourceUrl = `${currentUrl}stream/`;

            // Initialize the EventSource object
            eventSource = new EventSource(eventSourceUrl);

            eventSource.onmessage = event => {
                sseData.innerHTML = event.data;
                console.log("sse data: " + event.data); // Log the received data
            };

            document.querySelector('button[onclick="startSSE()"]').disabled = true;
            document.querySelector('button[onclick="stopSSE()"]').disabled = false;
        }

        function stopSSE() {
            if (eventSource) {
                eventSource.close();
                console.log("EventSource closed");
            }

            document.querySelector('button[onclick="startSSE()"]').disabled = false;
            document.querySelector('button[onclick="stopSSE()"]').disabled = true;
        }
    </script>

`

Я попытался реализовать тот же код в новом проекте django, и он работает без проблем (я настроил систему SSE точно таким же образом в обоих проектах). Я также попытался удалить некоторые промежуточные модули, но все еще безрезультатно.

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