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()
相关推荐
魔尔助理顾问16 分钟前
Flask如何读取配置信息
python·flask·bootstrap
jc_hook1 小时前
Python 接入DeepSeek
python·大模型·deepseek
chicpopoo1 小时前
Python打卡DAY25
开发语言·python
crazyme_62 小时前
深入掌握 Python 切片操作:解锁数据处理的高效密码
开发语言·python
Code_流苏3 小时前
《Python星球日记》 第69天:生成式模型(GPT 系列)
python·gpt·深度学习·机器学习·自然语言处理·transformer·生成式模型
于壮士hoho4 小时前
Python | Dashboard制作
开发语言·python
掘金-我是哪吒4 小时前
分布式微服务系统架构第131集:fastapi-python
分布式·python·微服务·系统架构·fastapi
小猪快跑爱摄影5 小时前
【Folium】使用离线地图
python
keke105 小时前
Java【10_1】用户注册登录(面向过程与面向对象)
java·python·intellij-idea
微刻时光6 小时前
影刀RPA网页自动化总结
运维·人工智能·python·低代码·自动化·rpa·影刀rpa