开发者

django配置使用asgi的实现步骤

开发者 https://www.devze.com 2025-03-20 09:21 出处:网络 作者: LCY133
目录一、配置前提二、基础配置步骤1. 创建/修改 ASGI 入口文件2. 修改项目设置3. 项目结构验证三、不同场景配置示例场景1:纯HTTP服务场景2:WebSocket服务四、运行与验证1. 使用 Daphne 启动2. 生产环境部署(Nginx
目录
  • 一、配置前提
  • 二、基础配置步骤
    • 1. 创建/修改 ASGI 入口文件
    • 2. 修改项目设置
    • 3. 项目结构验证
  • 三、不同场景配置示例
    • 场景1:纯HTTP服务
    • 场景2:WebSocket服务
  • 四、运行与验证
    • 1. 使用 Daphne 启动
    • 2. 生产环境部署(Nginx + Daphne)
    • 3. 测试命令
  • 五、常见问题解决
    • 错误1:You have not set ASGI_APPLICATION
    • 错误2:Requested setting INSTALLED_APPS...
    • 错误3:WebSocket连接失败
  • 六、高级配置
    • 1. 使用Redis通道层(生产环境)
  • 七、关键注意事项
    • 八 编写start.py启动django+asgi

      一、配置前提

      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 www.devze.comimport 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/',android 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(
              UpythonRLRouter(
                  your_app.routihttp://www.devze.comng.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_upgrpythonade;
          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内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)! 

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号