Ранние последователи асинхронной функции Django3.0

Django
Ранние последователи асинхронной функции Django3.0

на прошлой неделеDjangoОфициально выпущенDjango 3.0версия, самая важная из которых — обновитьASGIслужба поддержки. Да, сегодняDjango 3.0Я сделал простую пробную асинхронную функцию и проанализировал процесс, надеясь всем помочь.

Подробный список обновлений можно найти на официальномDjango 3.0 release notes, я не буду вдаваться в подробности здесь, давайте начнем.

Готов к работе

Прежде чем мы начнем, давайте подготовим среду, напрямую воспользуемся Pycharm для создания нового проекта и создадим новую виртуальную среду.

Получите следующие предметы:

По сравнению с предыдущей версией проекта django появилась еще однаasgi.py. ЭтоASGIВходной файл службы, содержимое в основном такое жеwsgi.py.

Знание протокола ASGI

В использованииASGIПеред тем, как начать, давайте разберемся, что такое ASGI?

ASGIа такжеWSGI, оба являются протоколом интерфейса шлюза веб-служб,CGIпостроен по стандарту.

CGI(Общий интерфейс шлюза, Общий интерфейс шлюза), простыми словами, это общий протокол, который анализирует запросы, отправленные клиентами, такими как браузеры, на сервер, и собирает HTTP-запросы, которые необходимо вернуть.Программа, которая обрабатывает этот процесс, может быть назван CGI.сценарий. Ранние динамические веб-страницы Интернета основаны наCGIстандарт.

(Источник изображения:nuggets.capable/post/684490…

WSGI, представляет собой специфичный для Python интерфейс шлюза веб-сервера, который разделен на две части: «сервер (или шлюз)» и «приложение (или структура приложения)». «Сервер», как правило, независимый от среды приложения, предоставляет информацию о среде и функцию обратного вызова для запуска приложения. Когда приложение завершает обработку запроса, оно отправляет результат обратно на сервер через функцию обратного вызова. общийWSGIНа серверах есть:uwsgi,gunicon. «Приложение» — это множество реализацийWSGIСтандартная веб-инфраструктура Python, обычно используемая:Django,FlaskЖдать.

ASGI(Асинхронный интерфейс шлюза сервера) — это протокол интерфейса шлюза веб-сервера Python с асинхронной функцией, предложенный командой Django. Способен обрабатывать многие распространенные типы протоколов, включая HTTP, HTTP2 и WebSocket.WSGIОн основан на режиме протокола HTTP и не поддерживаетWebSocket,а такжеASGIОн был создан для решения проблемы, связанной с тем, что WSGI, который обычно используется в Python, не поддерживает некоторые новые стандарты протоколов (WebSocket, Http2 и т. д.) в текущей веб-разработке. в то же время,ASGIобратная совместимостьWSGIСтандартный, можно запустить несколькими способамиWSGIприложение. Обычно используемый "сервер" тамDaphne,Uvicorn.

БолееASGIИнформация может быть переданаДокументация

Использовать процесс

понялASGI, переходим к делу. оASGIсуществуетDjango release NotesВ документе не так много введения, есть только один развернутый документHow to deploy with ASGI

После прочтения в основном есть два метода развертывания: daphne и uvicorn. в"должен использоватьDaphneилиUvicornРазвертывание будет службой ASGI, прямой запуск сервера — службой синхронизации.«Это предложение напоминает нам, что если вы хотите использовать ASGI, вы не можете запускать сервер напрямую.

Случайным образом выбираем способ использования и запускаем сервис:

# 安装
pip install  uvicorn

# 启动服务
uvicorn django3_demo.asgi:application

Журнал запуска выглядит следующим образом:

$ uvicorn django3_demo.asgi:application
INFO:     Started server process [48508]
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Waiting for application startup.
INFO:     ASGI 'lifespan' protocol appears unsupported.
INFO:     Application startup complete.

согласно сASGIфункции, которые могут поддерживать HTTP, HTTP2 и WebSocket. Затем давайте протестируем веб-сокет и http.

тест веб-сокета

Откройте консоль консоли браузера, создайте новую ссылку на веб-сокет, и произойдет следующая ошибка:

См. сервисную ошибку следующим образом:

INFO:     Application startup complete.
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "/Users/xiumin1/.local/share/virtualenvs/django3_demo/lib/python3.6/site-packages/uvicorn/protocols/websockets/websockets_impl.py", line 153, in run_asgi
    result = await self.app(self.scope, self.asgi_receive, self.asgi_send)
  File "/Users/xiumin1/.local/share/virtualenvs/django3_demo/lib/python3.6/site-packages/uvicorn/middleware/proxy_headers.py", line 45, in __call__
    return await self.app(scope, receive, send)
  File "/Users/xiumin1/.local/share/virtualenvs/django3_demo/lib/python3.6/site-packages/django/core/handlers/asgi.py", line 146, in __call__
    % scope['type']
ValueError: Django can only handle ASGI/HTTP connections, not websocket.

Django can only handle ASGI/HTTP connections, not websocket, кажется, что ASGI Django не полностью реализован и поддерживает только HTTP.

http-тест

Введите в браузереhttp://127.0.0.1:8000Появилась знакомая маленькая ракетная страничка. Это всего лишь простая стартовая страница, нам нужно написать асинхронное представление и модель для ее работы.

Пролистав документацию, в маленьком уголке:

К моему разочарованию, я нашел следующие инструкции:

Django разрабатывает поддержку асинхронного («асинхронного») Python, но пока не поддерживает асинхронные представления или промежуточное ПО; они появятся в будущем выпуске.

Основной смысл в том, что асинхронные представления и промежуточное ПО на данном этапе не поддерживаются. Это означает, что его нельзя реализовать нативным способом Django.ASGI.

На этом испытания асинхронной функции подошли к концу. В заключение,На данном этапеDjangoРодной или не полностью поддерживаемыйASGIоказание услуг. Если вы хотите полностью реализоватьASGIсервис, еще нуженChannelsилиstarlette.

Просмотрев материалы, я нашел главного промоутера нативной асинхронности Django.Andrew GodwinБлог, описывающий график разработки асинхронных функций. Примерно так:

  • Django 2.1: текущий незавершенный выпуск. Никакой асинхронной работы.
  • Django 2.2: начальная работа по добавлению асинхронного ORM и функции просмотра, но по умолчанию все синхронизировано по умолчанию, а асинхронная поддержка в основном основана на пулах потоков.
  • Django 3.0: Перепишите внутренний стек обработки запросов, чтобы он был полностью асинхронным, добавьте асинхронное промежуточное ПО, формы, кэширование, сеансы, аутентификацию. Начните процесс устаревания для всех API, которые становятся только асинхронными.
  • Django 3.1: Продолжайте улучшать асинхронную поддержку, потенциальные изменения асинхронного шаблона
  • Django 3.2: завершите устаревший процесс и получите асинхронный Django.

Судя по функциям, выпущенным в 3.0 сейчас, реализация кажется отставшей от времени на одну версию, и реализованы только те функции, которые должны быть в 2.2.

На этом сегодняшняя раздача подошла к концу. Наконец, я все еще надеюсь, что асинхронная функция Django скоро появится, и тогда мы сможем напрямую использовать django для разработки различных асинхронных функций без необходимости установки стороннего программного обеспечения.

Расширенное чтение