python中django+websocket实现系统消息通知
时间: 2023-07-31 20:12:48 浏览: 135
在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库。
希望这个教程能够帮助你实现Django和WebSocket的消息通知功能。
阅读全文