当前位置: 首页 > article >正文

django如何配置使用asgi

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


一、配置前提

  1. Django 版本:确保使用 Django 3.0+(原生支持 ASGI)
  2. 必要依赖
    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服务
  1. 创建路由文件 your_app/routing.py
from django.urls import path
from . import consumers

websocket_urlpatterns = [
    path('ws/chat/', consumers.ChatConsumer.as_asgi()),
]
  1. 修改 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)],
        },
    }
}

七、关键注意事项

  1. 开发/生产环境区分:通道层配置需要根据环境变化
  2. 性能监控:使用 daphne--verbosity 参数调试
  3. 版本兼容性
    • 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()

http://www.kler.cn/a/591333.html

相关文章:

  • 【LInux进程六】命令行参数和环境变量
  • 【大模型基础_毛玉仁】2.6 非 Transformer 架构
  • SSH后判断当前服务器是云主机、物理机、虚拟机、docker环境
  • 谈谈 TypeScript 中的模块系统,如何使用 ES Modules 和 CommonJS 模块?
  • STM32---FreeRTOS内存管理实验
  • 剑指 Offer II 109. 开密码锁
  • 【go】soilid与设计模式
  • 【Leetcode】203.移除链表元素
  • MyBatis 如何创建 SqlSession 对象的?
  • 手抖护理指南:全方位守护患者生活
  • 华为ISC+战略规划项目数字化转型驱动的智慧供应链革新(169页PPT)(文末有下载方式)
  • 为什么Django能有效防御CSRF攻击?
  • 爬虫基础之爬取猫眼Top100 可视化
  • Qt之自定义界面组件 一
  • 地宫取宝---dfs‘记忆
  • Python核心:Django鉴权方案全解析
  • Android第四次面试总结(基础算法篇)
  • SpringCloud 学习笔记2(Nacos)
  • 实验9-2 高级搜索技术2
  • browser-use WebUI + DeepSeek 基于AI的UI自动化解决方案