Django配置websocket
# setting.py 配置
INSTALLED_APPS = [
'···',
'channels',
'···',
]
ASGI_APPLICATION = 'face_safe.asgi.application'
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [(os.getenv('REDIS_SERVER_HOST', '192.168.2.175'), int(os.getenv('REDIS_SERVER_PORT', '6379')))],
},
},
}
# setting.py 同级新增asgi.py
import os
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
from apps.telecom.routing import websocket_urlpatterns
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'face_safe.settings')
application = ProtocolTypeRouter({
'http': get_asgi_application(),
'websocket': AuthMiddlewareStack(
URLRouter(
websocket_urlpatterns
)
)
})
# routing.py
# -*- coding: utf-8 -*-
"""
@author: Mr_zhang
@software: PyCharm
@file: routing.py
@time: 2021/11/23 下午2:06
"""
from django.urls import path
from apps.telecom import consumer
websocket_urlpatterns = [
path('v1/ws/telecom/roll_call/', consumer.RollCallConsumer.as_asgi()),
]
# consumer.py
# -*- coding: utf-8 -*-
"""
@author: Mr_zhang
@software: PyCharm
@file: consumer.py
@time: 2021/11/23 下午2:06
"""
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 = "face_safe"
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['message_type']
message = message['message']
data = {
'message_type': message_type,
'message': message
}
await self.send(json.dumps(data, ensure_ascii=False))
def send_message(group_name="face_safe", message=None, message_type=None):
"""
WS广播: 外部函数调用
:param message_type: 消息类型
:param group_name: 组名称
:param message: 消息内容
:return:
"""
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
}
)
# 函数调用广播推送
consumer.send_message(
message_type='record',
message=monitor_serializers.MonitorDiscoverSerializers(instance).data
)
可通过在线websocket测试: http://www.jsons.cn/websocket/
本文来自博客园,作者:一石数字欠我15w!!!,转载请注明原文链接:https://www.cnblogs.com/52-qq/p/15671069.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)