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 точно таким же образом в обоих проектах). Я также попытался удалить некоторые промежуточные модули, но все еще безрезультатно.