首页 > 其他分享 >Django中安装websocket

Django中安装websocket

时间:2024-01-16 11:25:27浏览次数:30  
标签:websocket name data self Django import group message 安装

完整代码: https://gitee.com/mom925/django-system

项目结构:


先安装所需库:
pip install channels

下面将websocket作为插件一样的只需要引入配置的结构

asgi.py文件 http请求不变、修改websocket请求调用路径
import os
import django
from channels.http import AsgiHandler
from channels.routing import ProtocolTypeRouter, URLRouter
from . import routing

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Wchime.settings')
django.setup()

application = ProtocolTypeRouter({
    "http": AsgiHandler(),
    "websocket": URLRouter(routing.websocket_urlpatterns),
})

 

同级目录下的请求路由文件 routing.py
from django.urls import path, re_path
from .consumers import RollCallConsumer, CustomRollCallConsumer

websocket_urlpatterns = [
    path('ws/', RollCallConsumer.as_asgi()),
    re_path(r'ws/(?P<group>\w+)/', CustomRollCallConsumer.as_asgi()),
]

 

创建一个consumers.py 定义收发消息


import json

from channels.generic.websocket import AsyncJsonWebsocketConsumer
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync


class RollCallConsumer(AsyncJsonWebsocketConsumer):
    group_name = "default_group"

    async def connect(self):
        await self.channel_layer.group_add(
            self.group_name,
            self.channel_name
        )
        await self.accept()

    async def disconnect(self, close_code):
        await self.channel_layer.group_discard(
            self.group_name,
            self.channel_name
        )

    async def receive(self, text_data=None, bytes_data=None, **kwargs):
        await self.send(text_data)

    async def send(self, text_data=None, bytes_data=None, close=False):
        await super(RollCallConsumer, self).send(text_data, bytes_data, close)

    async def push_messages(self, message):
        message_type = message['default_group']
        message = message['message']
        data = {
            'message_type': message_type,
            'message': message
        }
        await self.send(json.dumps(data, ensure_ascii=False))


class CustomRollCallConsumer(AsyncJsonWebsocketConsumer):
    group_name = "default_group"

    async def connect(self):
        self.group_name = self.scope['url_route']['kwargs'].get('group', 'default_group')
        await self.channel_layer.group_add(
            self.group_name,
            self.channel_name
        )
        await self.accept()

    async def disconnect(self, close_code):
        self.group_name = self.scope['url_route']['kwargs'].get('group', 'default_group')
        await self.channel_layer.group_discard(
            self.group_name,
            self.channel_name
        )

    async def receive(self, text_data=None, bytes_data=None, **kwargs):
        await self.send(text_data)

    async def send(self, text_data=None, bytes_data=None, close=False):
        await super(CustomRollCallConsumer, self).send(text_data, bytes_data, close)

    async def push_messages(self, message):
        message_type = message['default_group']
        message = message['message']
        data = {
            'message_type': message_type,
            'message': message
        }
        await self.send(json.dumps(data, ensure_ascii=False))


def send_message(group_name="default_group", message=None, message_type=None):
    """
    WS广播: 外部函数调用
    :param message_type: 消息类型
    :param group_name: 组名称
    :param message: 消息内容
    :return:
    """
    # print(get_channel_layer())
    # print("send msg")
    channel_layer = get_channel_layer()
    async_to_sync(channel_layer.group_send)(
        group_name,
        {
            'type': 'push.messages',  # push_messages函数
            'message': message,
            'message_type': message_type
        }
    )

定义一个配置文件settings.py,里面主要是注册app,添加asgi等配置
import os
import sys
from django.conf import settings
from conf.env import *
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

ASGI_APPLICATION = 'websocket_plugin.asgi.application'

# redis_host = "redis://" + REDIS_HOST + ":" + REDIS_PORT + "/" + REDIS_LIBRARY
redis_host = "redis://:" + REDIS_PWD + "@" + REDIS_HOST + ":" + REDIS_PORT + "/" + REDIS_LIBRARY
secret_k = 'wchime'

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            # 连接自己的redis
            "hosts": [redis_host],
            "symmetric_encryption_keys": [secret_k],
        },
    },
}

apps = ['channels']

settings.INSTALLED_APPS += [app for app in apps if app not in settings.INSTALLED_APPS]

 

最后只要在Django项目的settings.py文件中引入配置即可

from plugin.websocket_plugin.settings import *

 

成功启动服务

 








标签:websocket,name,data,self,Django,import,group,message,安装
From: https://www.cnblogs.com/moon3496694/p/17967244

相关文章

  • Linux CentOS 8 安装FTP服务和lftp服务
    一、ftp服务1、安装ftp服务[spj1@localhost~]$sudoyuminstallvsftpd//安装ffp服务 2、启动ftp服务[spj1@localhost~]$systemctlstartvsftpd//启动ftp服务====AUTHENTICATINGFORorg.freedesktop.systemd1.manage-units====启动“vsftpd.service”需要认证......
  • RabbitMQ部署安装
    1、RabbitMQ部署1.1.概述RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件),由以高性能、健壮以及可伸缩性出名的 Erlang 写成。因此使用RabbitMQ必须安装Erlang环境。说明:1、演示部署服......
  • Linux CentOS 8 安装DHCP服务
    DHCP如果虚拟机没有/etc/dhcp/dhcpd.conf文件,这可能是因为DHCP服务器软件包尚未安装,或者安装后配置文件未创建。要创建DHCP服务器配置文件dhcpd.conf,可以按照以下步骤操作:1、确保DHCP服务器软件已经安装。在CentOS8上,你可以使用以下命令安装DHCP服务器软件包:sudo......
  • java安装
    1.要使用Java,必须先安装什么?去哪里下载?目前学习jdk17JDK(JavaDevelopmentKit)开发者工具包;Oracle官网(Java软件|Oracle中国) 2.LTS版本有哪些?很多企业还在使用哪个JDK版本?JDK8、11、17、21    很多企业还在使用JDK8/JDK11。3.如何验证JDK是否安装成功了?打......
  • 41. 干货系列从零用Rust编写负载均衡及代理,websocket与tcp的映射,WS与TCP互转
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/......
  • 在Linux下, 不使用包管理器安装Golang sdk
    尝试从targz安装go下面这个是go官网的,注意使用代理下载;wgethttps://go.dev/dl/go1.21.6.linux-amd64.tar.gztar-zxvfgo1.13.1.linux-amd64.tar.gzmvgo//usr/local/将go添加到环境变量:确实fishshell是这样设置环境变量的吗?vim/etc/profile加入以下内容:e......
  • django05
    模板语法之过滤器(类似于内置函数)'''使用的时候可以看看源码'''1.语法结构数据对象|过滤器名称:参数22.常见过滤器(用在html文件里面)(django模板语法提供了60+过滤器,我们了解几个即可)①<p>统计数据的长度:{{s1|length}}</p>②<p>算术加法或者字符串加法:{{s1|add:111}}</......
  • 鸿蒙HarmonyOS实战-工具安装和Helloworld案例
    ......
  • linux安装花生壳,内网穿透
    1,官网下载linux版本的花生壳,命令:wget"https://dl.oray.com/hsk/linux/phddns_5.3.0_amd64.deb"-Ophddns_5.3.0_amd64.deb或者去官网下载deb包。2,解压,安装:dpkg-iphddns_5.3.0_amd64.deb3,运行:sudophddnsstart4,查看phddns的状态:sudophddnsstatus打开花生壳web链......
  • 一、windows安装opencv,并使用pycharm开发
    OpenCV入门毕设需要用到人脸识别,利用寒假学习下opencv的基本操作,希望可以有所收获安装python环境官网,下载安装exe文件,运行后选择添加path,安装成功结果如下:安装pycharm下载地址安装opencv命令行下运行:pipinstallopencv-python成功安装结果如下:无任何报错即为安装成功......