Python3 + Django + websocket使用

        这个博客主要写的是在Django框架中使用websocket,Django项目的创建和基本的配置已经算在前期环境配置,如果没有了解过Django使用的小伙伴请先看其他文章,简单学习以下Django的使用。

目录

前期环境配置

实现一个websocket小Dome

最后开启服务,开始测试。


前期环境配置

  • django如果要使用websocket的话,需要安装dwebsocket模块;
  • 安装daphne模块;
  • 安装channels模块;
  • 然后创建Django项目并做好简单配置。

实现一个websocket小Dome

  • 在settings中注册App:
INSTALLED_APPS = [
    'daphne', # 需要注册daphne
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'devicesview.apps.DevicesviewConfig',
    'channels',  # 需要注册channels
]
  •  在settings中配置ASGI服务器:
ASGI_APPLICATION = 'MyDjongoProject.asgi.application'
  • 在自己项目App目录下创建consumers.py,负责接收连接、接收消息等。
# consumers.py 

from channels.generic.websocket import WebsocketConsumer
from channels.exceptions import StopConsumer
from asgiref.sync import async_to_sync


class Client(WebsocketConsumer): # 类名可以随意起
    def websocket_connect(self, message):
        print("websocket_connect")
        self.accept()

    def websocket_receive(self, message):
        recv = message.get('text')
        print('Received data {}'.format(recv))

    def websocket_disconnect(self, message):
        print("websocket_disconnect")
        raise StopConsumer()
  • 创建routings.py配置websocker请求的url。
# coutings.py

from django.urls import path
from index import consumers # index是我的app

# 这个变量是存放websocket的路由
socket_urlpatterns = [
    path('client/', consumers.Client.as_asgi()),
]
  • 修改asgi.py默认仅支持http,需要增加websocket类型请求的路由。
# asgi.py

import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from MyDjongoProject import routings # 新增
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MyDjongoProject.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": URLRouter(routings.socket_urlpatterns) # 新增
})

最后开启服务,开始测试。

  • 开启服务
python3 manage.py runserver
WebSocket HANDSHAKING /client/ [127.0.0.1:43640]
websocket_connect
WebSocket CONNECT /client/ [127.0.0.1:43640]
Received data PING
Received data PING
Received data PING
Received data PING
Received data PING

测试成功了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Django使用WebSocket实现系统消息通知可以通过以下步骤实现: 1. 安装Django Channels和asgiref ```bash pip install channels asgiref ``` 2. 创建一个Django应用程序 ```bash python manage.py startapp notifications ``` 3. 创建一个WebSocket路由 在`notifications`应用程序中创建一个`routing.py`文件,添加以下内容: ```python from django.urls import re_path from . import consumers websocket_urlpatterns = [ re_path(r'ws/notifications/$', consumers.NotificationConsumer.as_asgi()), ] ``` 4. 创建一个WebSocket消费者 在`notifications`应用程序中创建一个`consumers.py`文件,添加以下内容: ```python import asyncio import json from channels.consumer import AsyncConsumer from channels.db import database_sync_to_async from django.contrib.auth.models import User class NotificationConsumer(AsyncConsumer): async def websocket_connect(self, event): await self.send({ "type": "websocket.accept" }) user = self.scope["user"] if user.is_authenticated: await self.channel_layer.group_add( f"user_{user.id}", self.channel_name ) async def websocket_receive(self, event): user = self.scope["user"] if user.is_authenticated: data = json.loads(event["text"]) message = data["message"] await self.create_message(user, message) await self.channel_layer.group_send( f"user_{user.id}", { "type": "user.message", "message": message } ) async def websocket_disconnect(self, event): user = self.scope["user"] if user.is_authenticated: await self.channel_layer.group_discard( f"user_{user.id}", self.channel_name ) @database_sync_to_async def create_message(self, user, message): user = User.objects.get(id=user.id) user.notifications.create(message=message) ``` 5. 配置WebSocket路由 在`settings.py`文件中添加以下内容: ```python ASGI_APPLICATION = 'project_name.routing.application' CHANNEL_LAYERS = { "default": { "BACKEND": "channels.layers.InMemoryChannelLayer" } } ROOT_URLCONF = 'project_name.urls' INSTALLED_APPS = [ ... 'channels', 'notifications', ] ``` 6. 创建一个JavaScript文件 在`static/js/notifications.js`文件中添加以下内容: ```javascript var socket = new WebSocket("ws://" + window.location.host + "/ws/notifications/"); socket.onmessage = function(event) { var message = JSON.parse(event.data)["message"]; alert(message); } ``` 7. 在模板中引入JavaScript文件 在需要使用WebSocket的模板中添加以下内容: ```html {% load static %} <script src="{% static 'js/notifications.js' %}"></script> ``` 现在,当用户登录并连接到WebSocket时,他们将加入名为`user_<user_id>`的组。当用户收到新消息时,消息将保存到数据库中,并通过WebSocket发送到所有连接到该组的用户。在前端,我们使用JavaScript来处理接收到的消息,这里简单地使用了一个警报框来显示消息,你可以改为使用其他的UI库。 希望这个教程能够帮助你实现DjangoWebSocket的消息通知功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值