ASGI¶
ASGI, или интерфейс шлюза асинхронного сервера, - это спецификация, на которой построены Channels и Daphne, предназначенная для абстрагирования приложений Channels от конкретного сервера приложений и обеспечения общего способа написания код приложения и промежуточного программного обеспечения.
Это духовный преемник WSGI, разработанный не только для асинхронного запуска через asyncio
, но и для поддержки нескольких протоколов.
Полная спецификация ASGI может быть найдена на http://asgi.readthedocs.io
Краткое описание¶
Приложение ASGI - это вызываемый объект, который принимает область видимости и возвращает вызываемую сопрограмму, которая принимает методы приема и отправки. Обычно это записывается как класс:
class Application:
def __init__(self, scope):
...
async def __call__(self, receive, send):
...
Словарь scope
определяет свойства соединения, такие как его удаленный IP (для HTTP) или имя пользователя (для протокола чата), а также время жизни соединения. Приложения создаются один раз для каждой области - например, один раз для HTTP-запроса или один раз для открытого соединения WebSocket.
Области действия всегда имеют ключ type
, который сообщает вам, какое это соединение и какие другие ключи следует ожидать в области (и какие сообщения ожидать).
Ожидаемый объект (awaitable) receive
предоставляет события в виде словарей по мере их возникновения, а awaitable send
отправляет события обратно клиенту в аналогичном формате словаря.
Сервер протокола находится между клиентом и кодом вашего приложения, декодируя необработанный протокол в область видимости и события и кодируя все, что вы отправляете обратно в протокол.
Компонуемость¶
Приложения ASGI, такие как WSGI, предназначены для компоновки, и они включают компоненты маршрутизации и промежуточного программного обеспечения каналов, такие как ProtocolTypeRouter
и SessionMiddeware
. Это просто приложения ASGI, которые принимают в качестве аргументов другие приложения ASGI, поэтому вы можете передать только одно приложение верхнего уровня для всего проекта Django и отправить его нужному потребителю в зависимости от того, с каким типом соединения вы работаете.
Спецификации протокола¶
Базовая спецификация ASGI только описывает интерфейс для приложения ASGI - она не определяет, как сетевые протоколы кодируются в области и из областей и словарей событий. Это работа спецификаций протокола:
HTTP и WebSocket: https://github.com/django/asgiref/blob/master/specs/www.rst