3.0.0 Примечания к выпуску¶
Обновление Channels 3 приводит Channels в соответствие с собственной поддержкой асинхронного ASGI в Django, представленной в Django 3.0.
Channels теперь интегрируется с асинхронной обработкой HTTP в Django, продолжая при этом поддерживать WebSockets и другие интересные типы потребителей.
Channels 3 поддерживает Django 3.x и последующие версии, а также продолжает поддерживать Django 2.2 LTS. Мы будем поддерживать Django 2.2 по крайней мере до выхода Django 3.2 LTS, но можем прекратить поддержку после этого, но до официального окончания срока службы Django 2.2.
Аналогично, мы поддерживаем Python 3.6+, но мы настойчиво советуем вам обновить его до последней версии Python, то есть до 3.9 на момент выпуска.
В нашей поддержке Django и Python мы отражаем реальность того, что async Python и async Django все еще быстро развиваются. Многие проблемы, с которыми мы сталкиваемся, просто исчезают при обновлении. Что бы вы ни делали с async, вам следует убедиться, что вы используете последние версии.
Главным событием этого выпуска является обновление до ASGI v3, что позволяет интегрироваться с поддержкой ASGI в Django. Кроме того, есть еще два ухудшения, с которыми вам придется иметь дело, если вы обновляете существующее приложение.
Обновление ASGI 3¶
Потребители теперь являются ASGI 3 single-callables с подписью:
application(scope, receive, send)
Для обычных потребителей это изменение должно быть в основном прозрачным, но вам нужно будет обновить
__init__()
(больше не принимает область видимости) и__call__()
(теперь принимает область видимости) если вы реализовали их самостоятельно.Теперь у потребителей есть метод класса
as_asgi()
, который нужно вызывать при настройке маршрутизации:websocket_urlpatterns = [ re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer.as_asgi()), ]
Это возвращает ASGI-приложение, которое будет инстанцировать потребителя по каждому запросу. Это похоже на Django’s
as_view()
, который служит той же цели. Вы можете передать аргументы ключевых слов для инициализации, если ваш потребитель требует их.Среднее программное обеспечение также необходимо будет обновить до сигнатуры ASGI v3. Класс
channels.middleware.BaseMiddleware
упрощен и доступен в качестве примера. Вероятно, вам не нужно будет создавать его подкласс в ASGI 3.
Амортизация¶
Использование
ProtocolTypeRouter
без явного ключа"http"
теперь неактуально.Следуя соглашениям Django, ваш скрипт точки входа должен называться
asgi.py
, и вы должны использоватьget_asgi_application()
, который используется шаблоном Django по умолчаниюasgi.py
для маршрутизации обработчика"http"
:from django.core.asgi import get_asgi_application application = ProtocolTypeRouter({ "http": get_asgi_application(), # Other protocols here. })
После снятия ограничения, когда мы откажемся от поддержки Django 2.2, неуказание ключа
"http"
будет означать, что ваше приложение не будет обрабатывать HTTP-запросы.Встроенный в Channels протокол HTTP
AsgiHandler
также устарел. Вам следует обновить версию Django 3.0 или выше и использовать протоколget_asgi_application()
от Django. Протокол ChannelAsgiHandler
будет удален, когда мы прекратим поддержку Django 2.2.