一、配置前提
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()到此这篇关于django配置使用asgi的实现步骤的文章就介绍到这了,更多相关django配置使用asgi内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论