【踩坑指南】Django+channels WebSocket配置

目前我搜到网上所有配置Django+channels的教程/博客中,都没有提及这一点。希望能帮助你

踩的坑必须写在最前面:

  1. 根据文档的步骤去配置,每次到执行python manage.py 的时,使用的是默认的development server,而不是我们想要的Starting ASGI/Daphne server
    在这里插入图片描述

解决办法:在项目的settings.py中
INSTALLED_APPS = [
“daphne”, # 增加daphne这一项,而且必须在channels之前
‘channels’,
]

出现原因:使用manage.py runserver 命令,默认是执行WSGI的(即使你更新并删除了settings.py中的WSGI),我们必须注册daphne/其他的服务端也可以,这样执行manage.py runserver 命令才会去更改默认的服务器,使用ASGI的。

问题背景:

最近,想去做一个ai训练模型在网页上进行展示,具体实现想法就是,前端发送状态,后端接收,将状态传入已经训练好的基于tensorflow框架下的神经网络模型,返回一个得到的动作,前端执行该动作获得新的状态,前端发送新的状态,如此循环,直至触发停止条件。

对于这种需求
使用http可以解决,但是每次新的状态都去发起请求,这对服务器的负荷是比较重的,
如果你也遇到了这个问题,可以考虑用webSocket去解决。

WebSocket协议:

Django+Channels,实现webSocket通信

step1:安装

pip install django>=3.0
pip install channels
pip install daphne

step2:创建project

django-admin startproject WebSocketTest

step3: 创建app

python manage.py startapp app01

step4:注册Chanels & daphne 这个daphe好多教程都不说,必须加!!!

  • webSocket / settings.py 中添加
INSTALLED_APPS = [
	 # 其他app
	 'daphne', # 必须在channels的上面
    'channels',
	# 其他app
]

step5:编写asgi.py

  • webSocket / asgi.py
import os

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

from webSocket import routing

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

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

step6:增加ASGI配置

  • webSocket / settings.py 中添加
ASGI_APPLICATION = 'webSocket.asgi.application'

step7:增加routing

  • 这routing的位置在哪个app里面都可以,这个我就将其放在 webSocket / routing.py
from  django.urls import path

from app01 import consumers

websocket_urlpatterns = [
    path('room/hony', consumers.ChatConsumer.as_asgi())
]

step8:编写consumers.py

  • 这consumers.py的位置在哪个app里面都可以,这个我就将其放在 app01 / consumers.py
from channels.exceptions import StopConsumer
from channels.generic.websocket import WebsocketConsumer


class ChatConsumer(WebsocketConsumer):
    def websocket_connect(self, message):
        self.accept()

    def websocket_receive(self, message):
        print(message)
        self.send("不要")

    def websocket_disconnect(self, message):
        raise StopConsumer()

step9:运行代码

python manage.py runserver

当出现
在这里插入图片描述
这个的时候,就说明成功了

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烂尾主教

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值