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()
相关推荐
賢84319 分钟前
工具层handle_response
python
欣然~1 小时前
基于蒙特卡洛方法的网格世界求解
开发语言·python·信息可视化
棉猴1 小时前
Pygame实现记忆拼图游戏14
python·游戏·pygame·游戏编程·python游戏编程
小爬虫程序猿1 小时前
如何解析返回的商品信息?
爬虫·python
搏博2 小时前
本地基于Ollama部署的DeepSeek详细接口文档说明
人工智能·python·深度学习·神经网络
小白的高手之路2 小时前
Pytorch中的torch.utils.data.Dataset 类
pytorch·python·深度学习
舊時王謝堂前燕3 小时前
macOS使用brew切换Python版本【超详细图解】
python·macos
yukai080084 小时前
【最后203篇系列】021 Q201再计划
python
battlestar5 小时前
Siemens Smart 200 PLC 通讯(基于python-)
前端·网络·python
人类群星闪耀时5 小时前
回溯法经典练习:组合总和的深度解析与实战
开发语言·python