django配置使用asgi的实现步骤

 更新时间:2025年03月19日 10:08:44   作者:LCY133  
本文主要介绍了django配置使用asgi的实现步骤,支持 ASGI 协议能处理传统HTTP请求,也能支持实时WebSocket通信,具有一定的参考价值,感兴趣的可以了解一下

一、配置前提

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 import 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/', 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(
        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)],
        },
    }
}

七、关键注意事项

  • 开发/生产环境区分:通道层配置需要根据环境变化
  • 性能监控:使用 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:

相关文章

  • Python使用sys.path查看当前的模块搜索路径

    Python使用sys.path查看当前的模块搜索路径

    sys.path 是 Python 中的一个列表,它用于存储模块搜索路径,当你使用 import 语句导入一个模块时,Python 会按照 sys.path 列表中的路径顺序来查找这个模块,本文给大家介绍了Python使用sys.path查看当前的模块搜索路径,需要的朋友可以参考下
    2025-02-02
  • 详解Python爬虫爬取博客园问题列表所有的问题

    详解Python爬虫爬取博客园问题列表所有的问题

    这篇文章主要介绍了详解Python爬虫爬取博客园问题列表所有的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Python实现简单图像缩放与旋转

    Python实现简单图像缩放与旋转

    大家好,本篇文章主要讲的是Python实现简单图像缩放与旋转,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 教你用Python寻找重复文件并删除的脚本写法

    教你用Python寻找重复文件并删除的脚本写法

    这篇文章主要介绍了如何用Python寻找重复文件并删除,该脚本主要包括diskwalk,chechsum,find_dupes,delete模块,其中diskwalk模块是遍历文件的,给定路径,遍历输出该路径下的所有文件,需要的朋友可以参考下
    2022-01-01
  • Python使用multiprocessing实现多进程的详细步骤记录

    Python使用multiprocessing实现多进程的详细步骤记录

    multiprocessing包是Python中的多进程管理包,与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程,下面这篇文章主要给大家介绍了关于Python使用multiprocessing实现多进程的详细步骤,需要的朋友可以参考下
    2024-08-08
  • Pandas 时间序列分析中的resample函数

    Pandas 时间序列分析中的resample函数

    这篇文章主要介绍了Pandas 时间序列分析中的resample函数,Pandas 中的resample函数用于各种频率的转换工作,下面我们就来看看其的参数、相关资料等,需要的小伙伴可以参考一下,希望给你带来帮助
    2022-02-02
  • Python实现指定范围内筛选并剔除Excel表格中的数据

    Python实现指定范围内筛选并剔除Excel表格中的数据

    这篇文章主要为大家详细介绍了Python如何实现在指定范围内筛选并剔除Excel表格中的数据,文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-06-06
  • Python安装及Pycharm安装使用教程图解

    Python安装及Pycharm安装使用教程图解

    这篇文章主要介绍了Python安装以及Pycharm安装使用教程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • python素数筛选法浅析

    python素数筛选法浅析

    这篇文章主要为大家详细介绍了python素数筛选法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 解决jupyter notebook显示不全出现框框或者乱码问题

    解决jupyter notebook显示不全出现框框或者乱码问题

    这篇文章主要介绍了解决jupyter notebook显示不全出现框框或者乱码问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04

最新评论