在 Python 3.6.13 和 Django 3.2.5 的组合下,如果你发现只能使用 ASGI 启动 Django 服务,而不能使用 WSGI,可能的原因有几个。我们来分析一下常见的问题和解决方案。
1. 默认 ASGI 支持
从 Django 3.0 开始,Django 引入了对 ASGI (异步服务器网关接口)的原生支持。默认情况下,Django 并不强制你使用 ASGI ,但它会优先考虑 ASGI 配置,如果你有相关的配置。
为什么会出现只能使用 ASGI 的情况?
ASGI_APPLICATION
配置: 如果在settings.py
中设置了ASGI_APPLICATION
配置,Django 会尝试使用 ASGI 启动。runserver
使用默认的 ASGI 配置: Django 3.x 版本中,runserver
命令会默认加载 ASGI 配置,除非你明确告诉它要使用 WSGI。
2. ASGI_APPLICATION
配置导致的行为
如果你在 settings.py
中配置了 ASGI_APPLICATION
,即使你没有安装 Django Channels ,Django 也会认为你想使用 ASGI 启动应用,而不是 WSGI。
检查并删除 ASGI_APPLICATION
配置:
python
# settings.py
# 如果这里有 ASGI_APPLICATION 配置,删除或注释掉它
ASGI_APPLICATION = 'your_project_name.asgi.application' # 删除这一行
如果删除了 ASGI_APPLICATION
配置,Django 应该会使用 WSGI 启动。
3. 检查 asgi.py
文件
如果你有 asgi.py
文件,Django 会倾向于使用它来启动 ASGI 。不过,Django 会优先考虑配置的 ASGI_APPLICATION
路径,或者如果没有该配置,它会尝试加载 asgi.py
文件来确定是否使用 ASGI 启动。
解决方法: 如果你不打算使用 ASGI ,你可以选择删除或忽略 asgi.py
文件,或者让它不包含任何 WebSocket 或 Channel 配置,保持简单。
python
# your_project_name/asgi.py
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project_name.settings')
application = get_asgi_application()
4. runserver
命令与 ASGI/WSGI
python manage.py runserver
命令默认使用 ASGI 启动服务器(如果 ASGI 配置存在)。如果没有配置 ASGI ,它会退回到 WSGI ,但是这个退回行为可能会因为项目配置和 Django Channels 的安装等因素发生变化。
5. 检查 wsgi.py
文件是否存在
确保你的项目中有一个有效的 wsgi.py
文件。如果你没有定义该文件,Django 在启动时无法找到对应的 WSGI 应用,可能会导致无法使用 WSGI 启动。
典型的 wsgi.py
文件内容如下:
python
# your_project_name/wsgi.py
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project_name.settings')
application = get_wsgi_application()
6. 开发服务器的行为
在 Django 开发服务器(runserver
)中,如果你没有进行 ASGI 配置,Django 会退回到 WSGI 。但在 Django 3.x 中,runserver
更倾向于 ASGI,因此出现了 只能使用 ASGI 启动 的情况。
解决方法:
- 如果你明确想使用 WSGI 启动,确保没有
ASGI_APPLICATION
配置,且项目中有wsgi.py
文件。 - 使用 Gunicorn 或 uWSGI 这些服务器来启动 WSGI。
7. 升级或回退 Django 版本
Django 3.x 中,开发服务器默认使用 ASGI ,如果你想避免使用 ASGI ,可以考虑回退到 Django 2.x 版本,或者在 Django 3.2.x 中明确配置 WSGI ,如删除 ASGI_APPLICATION
配置并确保使用 wsgi.py
。
总结:
如果你在 Django 3.2.5 中只能使用 ASGI 启动,问题可能在于以下几个方面:
- 配置了
ASGI_APPLICATION
。 - 项目中有
asgi.py
文件,导致 Django 选择 ASGI 启动。 runserver
默认会优先尝试使用 ASGI。
解决方案:
- 删除或注释掉
settings.py
中的ASGI_APPLICATION
配置。 - 确保项目中有正确配置的
wsgi.py
文件。 - 使用 Gunicorn 或 uWSGI 启动 WSGI 服务,避免使用
runserver
。