django使用channels实现webSocket启动失败

问题描述

使用channels启动ASGI结果却是普通启动,如下:

python 复制代码
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
July 15, 2023 - 18:23:49
Django version 4.2, using settings 'staffSystem_django.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

我希望得到的启动方式如下:

python 复制代码
System check identified no issues (0 silenced).
July 15, 2023 - 18:23:49
Django version 4.2, using settings 'staffSystem_django.settings'
Starting ASGI/Channels version 3.0.1 development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

setting.py:

python 复制代码
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'channels',
    'app01.apps.App01Config',
]


ASGI_APPLICATION = 'staffSystem_django.asgi.application'

asgi.py:

python 复制代码
import os

from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from . import routing

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'staffSystem_django.settings')

# application = get_asgi_application()

application = ProtocolTypeRouter({
    'http': get_asgi_application(),
    'websocket': URLRouter(routing.websocket_urlpatterns)
})

我打断点就拦不到,甚至ASGI_APPLICATION='' 都不报错。


原因分析:

盲猜是版本问题,查不到一个官方解释。人类疑惑高版本咋会失去低版本有的实用功能~

简直是人类迷惑,如果直接使用pip install channels 的话会自动下载比较高的版本(我下载的4.0.1 的版本),所以在注册channels的时候,Django的settings.py中ASGI_APPLICATION 没有被配置识别,使得总是在使用WSGI_APPLICATION 中的配置,我还以为是WSGI_APPLICATION 影响了,但是注释掉也不用ASGI_APPLICATION 。然后还不会报错,简直无语到家。我甚至还看见有另一个叫做django-channels,下载注册app后也没有卵用。


解决方案:

下载低版本

第一次尝试,我下载了2.3.0

python 复制代码
pip install channels==2.3.0

重新启动django程序,终于报错,看到报错是真开心不会一脸懵逼了。

报错提示信息说没有as_asgi() 这个函数。这个函数是我在安装channels=4.0.1 时写代码类名点出来的不是直接写出来的,证明父类 是一定有这个函数。我点进下载2.3.0后的源码查看确实没有这个函数,那就证明是后来才有这个函数。

第二次尝试,下载3.0.1,这次就成功了!!!

python 复制代码
pip install channels==3.0.1

启动django程序

python 复制代码
System check identified no issues (0 silenced).
July 15, 2023 - 18:17:31
Django version 4.2, using settings 'staffSystem_django.settings'
Starting ASGI/Channels version 3.0.1 development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

看到Starting ASGI/Channels 就是成功了。

再发送一个ws请求试试看,可以看到握手与连接的请求成功收到并返回

看看浏览器抓包,可以看到黄色方框的http 请求成功,红色方框的websocket 请求也是建立连接成功。

相关推荐
百锦再8 分钟前
[特殊字符] Python在CentOS系统执行深度指南
开发语言·python·plotly·django·centos·virtualenv·pygame
张子夜 iiii17 分钟前
4步OpenCV-----扫秒身份证号
人工智能·python·opencv·计算机视觉
潮汐退涨月冷风霜1 小时前
数字图像处理(1)OpenCV C++ & Opencv Python显示图像和视频
c++·python·opencv
酷飞飞8 小时前
Python网络与多任务编程:TCP/UDP实战指南
网络·python·tcp/ip
数字化顾问9 小时前
Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测
python
学生信的大叔10 小时前
【Python自动化】Ubuntu24.04配置Selenium并测试
python·selenium·自动化
计算机编程小央姐10 小时前
跟上大数据时代步伐:食物营养数据可视化分析系统技术前沿解析
大数据·hadoop·信息可视化·spark·django·课程设计·食物
诗句藏于尽头11 小时前
Django模型与数据库表映射的两种方式
数据库·python·django
智数研析社11 小时前
9120 部 TMDb 高分电影数据集 | 7 列全维度指标 (评分 / 热度 / 剧情)+API 权威源 | 电影趋势分析 / 推荐系统 / NLP 建模用
大数据·人工智能·python·深度学习·数据分析·数据集·数据清洗
扯淡的闲人11 小时前
多语言编码Agent解决方案(5)-IntelliJ插件实现
开发语言·python