django如何配置使用asgi
以下是 Django 配置使用 ASGI 的完整指南:
一、配置前提
- Django 版本:确保使用 Django 3.0+(原生支持 ASGI)
- 必要依赖:
pip install daphne channels
二、基础配置步骤
1. 创建/修改 ASGI 入口文件
在 Django 项目根目录(与 settings.py
同级)创建 asgi.py
:
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')
# 基础配置(无WebSocket需求)
application = get_asgi_application()
# 如果使用Channels(WebSocket支持)
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter(
your_app.routing.websocket_urlpatterns
)
),
})
2. 修改项目设置
settings.py
中添加:
# 配置ASGI应用路径
ASGI_APPLICATION = 'your_project.asgi.application'
# 如果使用Channels需要添加
INSTALLED_APPS = [
...
'channels',
'your_app',
]
# 配置通道层(开发环境使用内存层)
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels.layers.InMemoryChannelLayer"
}
}
3. 项目结构验证
your_project/
├── asgi.py # ASGI入口文件
├── settings.py
├── urls.py
└── your_app/
├── routing.py # WebSocket路由配置(可选)
...
三、不同场景配置示例
场景1:纯HTTP服务
# asgi.py
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')
application = get_asgi_application()
场景2:WebSocket服务
- 创建路由文件
your_app/routing.py
:
from django.urls import path
from . import consumers
websocket_urlpatterns = [
path('ws/chat/', consumers.ChatConsumer.as_asgi()),
]
- 修改
asgi.py
:
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import your_app.routing
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter(
your_app.routing.websocket_urlpatterns
)
),
})
四、运行与验证
1. 使用 Daphne 启动
daphne -b 0.0.0.0 -p 8000 your_project.asgi:application
2. 生产环境部署(Nginx + Daphne)
示例 Nginx 配置:
location / {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
}
3. 测试命令
# 测试HTTP
curl http://localhost:8000
# 测试WebSocket(使用wscat)
wscat -c ws://localhost:8000/ws/chat/
五、常见问题解决
错误1:You have not set ASGI_APPLICATION
• 确保 settings.py
中正确配置:
ASGI_APPLICATION = 'your_project.asgi.application'
错误2:Requested setting INSTALLED_APPS...
• 检查 DJANGO_SETTINGS_MODULE
环境变量是否正确设置
错误3:WebSocket连接失败
• 验证 CHANNEL_LAYERS
配置
• 检查Nginx是否配置了WebSocket代理
六、高级配置
1. 使用Redis通道层(生产环境)
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [("redis-server", 6379)],
},
}
}
七、关键注意事项
- 开发/生产环境区分:通道层配置需要根据环境变化
- 性能监控:使用
daphne
的--verbosity
参数调试 - 版本兼容性:
• Django 3.0+ 原生支持 ASGI
• Channels 3.0+ 需要 Python 3.6+
通过以上配置,Django 项目即可完整支持 ASGI 协议,既能处理传统HTTP请求,也能支持实时WebSocket通信。
八 编写start.py启动django+asgi
import os
from daphne.cli import CommandLineInterface
import django
import subprocess
import sys
def main():
base_path = os.path.dirname(os.path.abspath(__file__))
# print("#"*30)
# print(base_path)
chat_ai_path = os.path.join(base_path, 'xxx')
sys.path.append(chat_ai_path)
sys.path.append(base_path)
# 设置默认的 Django 设置模块
os.environ.setdefault("DJANGO_SETTINGS_MODULE", 'xxx') # 替换为您的项目名称
django.setup()
# 配置 Daphne 的运行参数
sys.argv = [
# "daphne",
"-b", "0.0.0.0",
"-p", "8000",
"xxx.asgi:application"
]
CommandLineInterface().run(sys.argv)
if __name__ == "__main__":
main()