Django 3.1 не удается запускать представления асинхронно

#python #django #asynchronous

#python #django #асинхронный

Вопрос:

Я запускаю Django-3.1 (а также я пробовал версию master 3.2) в режиме asgi через uvicorn. Но когда я открываю URL-адрес на нескольких вкладках браузера, я вижу запросы, которые должны обрабатываться последовательно. Похоже, что это утверждение из документов:

На сервере WSGI асинхронные представления будут выполняться в своем собственном цикле одноразовых событий.

также применяется к режиму ASGI.

Вот код, который я использую:

 # asgi.py
import os

from django.core.asgi import get_asgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
application = get_asgi_application()
  
 # settings.py
SECRET_KEY = "foo"
ROOT_URLCONF = "urls"
  
 # urls.py
import asyncio
import uuid

from django.http import HttpResponse
from django.urls import path


async def view(request):
    id = uuid.uuid4()
    print(f"{id} sleeping")
    await asyncio.sleep(5)
    print(f"{id} woke up")
    return HttpResponse("ok")


urlpatterns = [
    path("", view),
]
  

И вот последовательный вывод, который я вижу:

 $ uvicorn asgi:application
INFO:     Started server process [28020]
INFO:     Waiting for application startup.
INFO:     ASGI 'lifespan' protocol appears unsupported.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL C to quit)
bb1d30bc-b05e-4412-94ad-f4507c766074 sleeping
bb1d30bc-b05e-4412-94ad-f4507c766074 woke up
INFO:     127.0.0.1:51878 - "GET / HTTP/1.1" 200 OK
f451d614-89dd-401d-8302-13e842040a3a sleeping
f451d614-89dd-401d-8302-13e842040a3a woke up
INFO:     127.0.0.1:51878 - "GET / HTTP/1.1" 200 OK
  

Ответ №1:

Да, это моя вина. Вероятно, это как-то связано с кэшированием chrome. Достаточно отключить его в dev-tool или отправлять параллельные запросы с помощью curl, чтобы убедиться, что он работает правильно.

 seq 1 5 | xargs -n1 -P5  curl http://localhost:8000/