на прошлой неделе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
стандарт.
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 для разработки различных асинхронных функций без необходимости установки стороннего программного обеспечения.