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. Протокол Channel AsgiHandler будет удален, когда мы прекратим поддержку Django 2.2.

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