django如何配置使用asgi

以下是 Django 配置使用 ASGI 的完整指南:


一、配置前提

  1. Django 版本:确保使用 Django 3.0+(原生支持 ASGI)

  2. 必要依赖

    bash 复制代码
    pip install daphne channels

二、基础配置步骤

1. 创建/修改 ASGI 入口文件

在 Django 项目根目录(与 settings.py 同级)创建 asgi.py

python 复制代码
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 中添加:

python 复制代码
# 配置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服务
python 复制代码
# 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服务
  1. 创建路由文件 your_app/routing.py
python 复制代码
from django.urls import path
from . import consumers

websocket_urlpatterns = [
    path('ws/chat/', consumers.ChatConsumer.as_asgi()),
]
  1. 修改 asgi.py
python 复制代码
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 启动
bash 复制代码
daphne -b 0.0.0.0 -p 8000 your_project.asgi:application
2. 生产环境部署(Nginx + Daphne)

示例 Nginx 配置:

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. 测试命令
bash 复制代码
# 测试HTTP
curl http://localhost:8000

# 测试WebSocket(使用wscat)
wscat -c ws://localhost:8000/ws/chat/

五、常见问题解决

错误1:You have not set ASGI_APPLICATION

• 确保 settings.py 中正确配置:

python 复制代码
ASGI_APPLICATION = 'your_project.asgi.application'
错误2:Requested setting INSTALLED_APPS...

• 检查 DJANGO_SETTINGS_MODULE 环境变量是否正确设置

错误3:WebSocket连接失败

• 验证 CHANNEL_LAYERS 配置

• 检查Nginx是否配置了WebSocket代理


六、高级配置

1. 使用Redis通道层(生产环境)
python 复制代码
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("redis-server", 6379)],
        },
    }
}

七、关键注意事项

  1. 开发/生产环境区分:通道层配置需要根据环境变化
  2. 性能监控 :使用 daphne--verbosity 参数调试
  3. 版本兼容性
    • Django 3.0+ 原生支持 ASGI
    • Channels 3.0+ 需要 Python 3.6+

通过以上配置,Django 项目即可完整支持 ASGI 协议,既能处理传统HTTP请求,也能支持实时WebSocket通信。

八 编写start.py启动django+asgi

python 复制代码
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()
相关推荐
databook8 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar9 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780519 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_9 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机16 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机17 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机17 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机17 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i17 小时前
drf初步梳理
python·django
每日AI新事件17 小时前
python的异步函数
python