Нужно ли мне менять свой обычный код Django при представлении каналов Django?

Здравствуйте, я новичок в мире Python, поэтому я все еще пытаюсь понять осторожность при работе с ASGI. Я прочитал несколько руководств и документации, а также посмотрел несколько видео на YouTube. Однако в некоторых моментах я не был уверен.

У меня есть небольшое серверное приложение, использующее Django + Django Rest Framework.

Мой код очень тривиален и состоит из наиболее распространенных концепций фреймворка: представлений, сериализаторов, моделей, URL-адресов и т. Д. Кроме того, я использую реляционную базу данных.

Моя среда такова:

  • Python 3.8
  • Джанго 3
  • Фреймворк Django Rest 3.11

Теперь мне нужно добавить поддержку WebSockets, и я выполнил базовую настройку, описанную в руководстве Django Channels:

  • Я установил Django Channels 2.4.0 (Daphene 2.5.0)
  • Добавлены "каналы" в INSTALLED_APPS.
  • Я создал файл routing.py с пустым ProtocolTypeRouter
  • Я добавил ASGI_APPLICATION в свой settings.py
  • Я настроил файл asgi.py для использования каналов
  • На данный момент я не настраивал слои каналов.
  • На данный момент я не создал ни одной конечной точки WebSocket

После этих конфигураций сервер запуска использует сервер разработки ASGI, и, по-видимому, все мои конечные точки REST работают.

Некоторые вопросы:

  • Учитывая, что весь мой код синхронный, не нужно ли было бы вносить в него какие-либо корректировки?

  • Эта конфигурация, приведенная выше, уже выполняет всю магию, необходимую для безопасного выполнения моего синхронного кода на дафене, учитывая, что это сервер ASGI?

  • Могу ли я надежно и стабильно обслуживать обычные запросы HTTP и WebSockets, используя только ASGI? Или рекомендуется обслуживать HTTP-трафик с помощью WSGI и оставлять только трафик WebSockets для дафена?

  • Где именно следует позаботиться о синхронном коде?


person Marlon Patrick    schedule 23.06.2020    source источник
comment
Марлон, вы используете только django-channels или дополнительный компонент channel-Layers?   -  person Mario Orlandi    schedule 14.07.2020
comment
На данный момент только django-каналы, но вскоре мы думаем о внедрении уровня каналов с Redis.   -  person Marlon Patrick    schedule 14.07.2020


Ответы (1)


Это мои ответы, основанные на предыдущем опыте работы с Django Channels 2 ...

1) Учитывая, что весь мой код синхронный, не нужно ли вносить в него какие-либо изменения?

Вы можете безопасно сохранить существующий код синхронизации: никаких настроек не требуется; просто не забудьте вызвать «синхронизирующую версию» API django-channels (т.е. SyncConsumer вместо AsyncConsumer).

С другой стороны, Channel Layers использует другой подход и предоставляет только асинхронную версию. Когда вызов выполняется из кода синхронизации, вам необходимо использовать оболочку async_to_sync; Например:

from asgiref.sync import async_to_sync

async_to_sync(channel_layer.group_send)(
    group, {
        "type": 'data_received',
        "content": data,
    })

2) Эта конфигурация, приведенная выше, уже выполняет всю магию, необходимую для безопасного выполнения моего синхронного кода на дафене, учитывая, что это сервер ASGI?

Единственная недостающая информация (в файле настроек):

ROOT_URLCONF = 'project.urls'

3) Могу ли я надежно и стабильно обслуживать обычные запросы HTTP и WebSockets, используя только ASGI? Или рекомендуется обслуживать HTTP-трафик с помощью WSGI и оставлять дафену только трафик WebSockets?

Используя каналы 2, вы можете безопасно выбрать использование Дафны как для запросов HTTP, так и для запросов WebSockets, поскольку Дафна будет автоматически согласовывать между HTTP и WebSocket; это то, что я обычно делаю в своих проектах.

Разделение трафика HTTP и WebSocket таким образом:

  • выполнение стандартных HTTP-запросов через сервер WSGI
  • использование Daphne (или uvicorn) только для вещей, которые WSGI не может делать, например, WebSockets, HTTP long-polling или других протоколов IoT

возможно, но совершенно необязательно.

person Mario Orlandi    schedule 14.07.2020