如何使用 ASGI 来部署

同 WSGI 一样,Django 也支持使用 ASGI 来部署,它是为了支持异步网络服务器和应用而新出现的 Python 标准。

Django 的管理命令 startproject 生成了一个默认的 ASGI 配置,你可以按照自己项目的需要去调整这个配置,任何兼容 ASGI 的应用程序服务器都可以直接使用。

Django 提供了下面这些 ASGI 服务的入门文档:

application 对象

与WSGI类似,ASGI需要你提供 application 可以让应用程序服务器用它与你的代码交互。可调用的应用程序 application 一般以一个位于 Python 模块中,名为应用程序 application 的对象的形式提供,且对服务器可见。

startproject 命令创建了文件 <project_name>/asgi.py,其中包含了 application callable应用程序。

它不会被开发服务器使用 (runserver) ,但是可以在开发环境或生产环境中用任意一种ASGI服务器来使用。

ASGI服务器通常会以字符串形式获取可调用应用程序的路径;对于大多数Django项目来说,应用程序形如 myproject.asgi:application

警告

Django默认的ASGI处理器会将你所有的代码放在一个同步的线程内运行,但你如果选择运行自己的异步处理器,你必须确保它是异步安全的。

不要在异步代码中调用阻塞的同步函数或库。Django会阻止你这样异步不安全地使用Django的内容,但是对第三方应用程序或者Python库不一定会这样。

配置 settings 模块

当 ASGI 服务器加载应用程序时,Django 需要导入配置模块——完整定义应用程序的地方。

Django 利用 DJANGO_SETTINGS_MODULE 环境变量来定位合适的配置模块。它必须包含到配置模块的点式路径。开发环境和生产环境可以配置不同值;这都取决于你是如何组织配置的。

若未设置该变量,文件 asgi.py 默认将其配置为 mysite.settingsmysite 即工程名字。

应用 ASGI 中间件

为了应用ASGI中间件,或者将Django嵌入到其他的ASGI应用程序中,你可以将Django的 application 应用程序对象包装到 asgi.py 文件中。举个例子:

from some_asgi_library import AmazingMiddleware
application = AmazingMiddleware(application)