• en
  • Language: ru
  • Documentation version: 3

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 - она не определяет, как сетевые протоколы кодируются в области и из областей и словарей событий. Это работа спецификаций протокола: