From 8e0724bbecce1e1832a88f4cade8997ccd50ba7f Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 1 Sep 2023 09:12:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0websocket=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ws/__init__.py | 0 apps/ws/admin.py | 3 ++ apps/ws/apps.py | 6 +++ apps/ws/consumers.py | 74 ++++++++++++++++++++++++++++++++++ apps/ws/migrations/__init__.py | 0 apps/ws/models.py | 3 ++ apps/ws/routing.py | 9 +++++ apps/ws/tests.py | 3 ++ apps/ws/views.py | 3 ++ server/asgi.py | 8 ++-- 10 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 apps/ws/__init__.py create mode 100644 apps/ws/admin.py create mode 100644 apps/ws/apps.py create mode 100644 apps/ws/consumers.py create mode 100644 apps/ws/migrations/__init__.py create mode 100644 apps/ws/models.py create mode 100644 apps/ws/routing.py create mode 100644 apps/ws/tests.py create mode 100644 apps/ws/views.py diff --git a/apps/ws/__init__.py b/apps/ws/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/ws/admin.py b/apps/ws/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/apps/ws/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/ws/apps.py b/apps/ws/apps.py new file mode 100644 index 00000000..2c87a482 --- /dev/null +++ b/apps/ws/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class WsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'ws' diff --git a/apps/ws/consumers.py b/apps/ws/consumers.py new file mode 100644 index 00000000..738a7b26 --- /dev/null +++ b/apps/ws/consumers.py @@ -0,0 +1,74 @@ +from channels.generic.websocket import AsyncWebsocketConsumer +import json + + +class RoomConsumer(AsyncWebsocketConsumer): + async def connect(self): + self.room_name = self.scope['url_route']['kwargs']['room_name'] + self.room_group_name = 'chat_%s' % self.room_name + + # Join room group + await self.channel_layer.group_add( + self.room_group_name, + self.channel_name + ) + username = self.scope['user'].username + await self.channel_layer.group_send( + self.room_group_name, + { + 'type': 'chat', + 'msg': f'你好,{username}, 欢迎进入{self.room_name}房间' , + 'from': '系统', + 'to': username + } + ) + await self.accept() + + async def disconnect(self, close_code): + # Leave room group + await self.channel_layer.group_discard( + self.room_group_name, + self.channel_name + ) + + async def receive_json(self, content, **kwargs): + sender_user = self.scope["user"] + if content['type'] == 'chat': + content['from'] = sender_user.username + await self.channel_layer.group_send( + self.room_group_name, + content + ) + + async def chat(self, content): + await self.send(json.dumps(content, ensure_ascii=False)) + + +class MyConsumer(AsyncWebsocketConsumer): + async def connect(self): + user_id = self.scope['user'].id + self.room_group_name = f'user_{user_id}' + # Join room group + await self.channel_layer.group_add( + self.room_group_name, + self.channel_name + ) + await self.channel_layer.group_send( + self.room_group_name, + { + 'type': 'event', + 'msg': '你好,' + self.scope['user'].username, + 'from': '系统' + } + ) + await self.accept() + + async def disconnect(self, close_code): + # Leave room group + await self.channel_layer.group_discard( + self.room_group_name, + self.channel_name + ) + + async def event(self, content): + await self.send(json.dumps(content, ensure_ascii=False)) diff --git a/apps/ws/migrations/__init__.py b/apps/ws/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/ws/models.py b/apps/ws/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/apps/ws/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/apps/ws/routing.py b/apps/ws/routing.py new file mode 100644 index 00000000..589b0679 --- /dev/null +++ b/apps/ws/routing.py @@ -0,0 +1,9 @@ +from django.urls import path +from apps.ws.consumers import MyConsumer, RoomConsumer + +WS_BASE_URL = 'ws/' + +websocket_urlpatterns = [ + path(f'{WS_BASE_URL}my/', MyConsumer.as_asgi()), + path(WS_BASE_URL + '/', RoomConsumer.as_asgi()), +] \ No newline at end of file diff --git a/apps/ws/tests.py b/apps/ws/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/apps/ws/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/ws/views.py b/apps/ws/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/apps/ws/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/server/asgi.py b/server/asgi.py index 8fd3ba56..5632900a 100755 --- a/server/asgi.py +++ b/server/asgi.py @@ -10,16 +10,16 @@ https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/ import os from channels.routing import ProtocolTypeRouter, URLRouter from django.core.asgi import get_asgi_application -from channels.auth import AuthMiddlewareStack -import apps.monitor.routing +from apps.utils.middlewares import TokenAuthMiddleware +import apps.ws.routing os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') application = ProtocolTypeRouter({ "http": get_asgi_application(), - "websocket": AuthMiddlewareStack( + "websocket": TokenAuthMiddleware( URLRouter( - apps.monitor.routing.websocket_urlpatterns + apps.ws.routing.websocket_urlpatterns ) ) }) \ No newline at end of file