Django中安装websocket
完整代码: 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 *
成功启动服务

Django中安装websocket的更多相关文章
- 利用dwebsocket在Django中使用Websocket
一.Websockets介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信 ...
- django中实现websocket
一.Websockets介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信 ...
- Django中使用websocket并实现简易聊天室
django使用websocket并实现简易聊天室 django默认只支持http协议 如果你想让django即支持http协议又支持websocket协议,则需要做以下配置 前期配置 前提需要安装c ...
- Django中安装搜索引擎方法。
全文检索 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理. haystack:全文检索的框架,支持whoosh.solr.Xapian.Elasticsearc ...
- django中安装pillow ValueError: zlib is required unless explicitly disabled using --disable-zlib, aborting
在windows系统上,使用 pip install pillow安装pillow时 报错 在使用 easy_install Pillow 方式安装成功,默认是最高版本 如果需要在安装时,指定安装版 ...
- Django中的许可(Permissions)和用户组(Group)
Reference: http://www.cnblogs.com/esperyong/archive/2012/12/20/2826690.html 接着上面的3篇讨论文章,我们阐述了Django中 ...
- 在阿里云的CentOS环境中安装django
购买了一台阿里云主机.操作系统为CentOS 6.5.准备在上面跑Django做Web开发.因为CentOS自带的python版本号较低,安装Django先要安装新版本号python.还是费了点周折. ...
- day 61 Django part-1 django的安装,以及初学者三件套(以及settings中的mysql配置)
我们的django到底是什么东西呢? 我们的代码都是在后台写的,包括我们的pycharm都是属于后台的工具,但是我们的后端开发说到底是需要开发完了之后拿到用户面前的,让我们的用户看到我们的东西,首先要 ...
- Django中redis的使用方法(包括安装、配置、启动)
一.安装redis: 1.下载: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 2.解压 tar -zxvf redis-3.2. ...
- 在Django中使用redis:包括安装、配置、启动。
一.安装redis: 1.下载: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 2.解压 tar -zxvf redis-.tar ...
随机推荐
- 来世再不选Java!
危机感 距离上一次找工作面试已经过去快2年了,那时候正值疫情肆虐,虽然还未感受到"寒潮来临"的苗头,但最终还是成功通过了几轮面试,顺利签约.在目前公司待了2年了,在大环境的影响下, ...
- Java 面试题之 Logback 打印日志是如何获取当前方法名称的?
在 Java 中,有四种方法可以获取当前正在执行方法体的方法名称,分别是: 使用 Thread.currentThread().getStackTrace() 方法 使用异常对象的 getStackT ...
- Calendar日历类型常见方法(必看!!)
Hi i,m JinXiang 前言 本篇文章主要介绍Calendar日历类型的几种常见方法以及部分理论知识 欢迎点赞 收藏 留言评论 私信必回哟 博主收将持续更新学习记录获,友友们有任何问题可以在 ...
- Python输入某年某月某日,判断这一天是这一年的第几天?
while 1: year = int(input('year:\n')) #输入年.月.日 month = int(input('month:\n')) day = int(input('day:\ ...
- [USACO2022OPEN S] Subset Equality S
[USACO22OPEN] 题目描述 奶牛们正在尝试一种相互交换编码信息的新方法,她们在相关的字母中混入不相关的字母,使信息难以解码. 奶牛们传输两个字符串 \(s\) 和 \(t\),每个字符串的长 ...
- 精致的Javascript代码
1. 统计一个数组中,每个值的个数 var cards = [1, 2, 3, 4, 3, 2, 1, 4, 5] var dict = {}; for(var i = 0; i < cards ...
- Selenium接管已经打开的浏览器并爬取数据
""" P.S:需要接管现有浏览器 ** 使用步骤: 1.打开浏览器,设置好远程调试端口,并扫描登录淘宝. chrome.exe --remote-debugging-p ...
- 可视化大屏与GIS之间如何实现互补?
在当今数字化时代,可视化大屏和地理信息系统(GIS)是两个在不同领域发挥重要作用的技术.可视化大屏以其生动.直观的图表.图像和动画展示方式,为数据可视化和信息展示提供了强大的工具.而GIS则通过地理空 ...
- python获取已安装程序列表
python获取已安装程序列表 本文主要讲述通过python脚本获取android 设备已安装列表. 首先,Python本身无法直接获取Android设备上已安装的程序列表,所以这里主要借助adb命令 ...
- 为什么要实践 A+ES & CQRS ?
Wow : 基于 DDD & EventSourcing 的现代响应式 CQRS 架构微服务开发框架 中文文档 领域驱动 | 事件驱动 | 测试驱动 | 声明式设计 | 响应式编程 | 命令查 ...