WebSocket Secure(WSS)在Django项目中的使用
游戏同步
游戏地图中需要进行同步的动作:
attack表示的是对每一个受到的攻击这一动作进行同步
配置channels_redis
1. 安装channels_redis:
pip install channels_redis
2. 配置acapp/asgi.py
内容如下:import osfrom channels.auth import AuthMiddlewareStack from channels.routing import ProtocolTypeRouter, URLRouter from django.core.asgi import get_asgi_application from game.routing import websocket_urlpatternsos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'acapp.settings')application = ProtocolTypeRouter({"http": get_asgi_application(),"websocket": AuthMiddlewareStack(URLRouter(websocket_urlpatterns)) })
3. 配置acapp/settings.py
在INSTALLED_APPS中添加channels,添加后如下所示:INSTALLED_APPS = [ 'channels','game.apps.GameConfig','django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles', ]
然后在文件末尾添加:ASGI_APPLICATION = 'acapp.asgi.application' CHANNEL_LAYERS = {"default": {"BACKEND": "channels_redis.core.RedisChannelLayer","CONFIG": {"hosts": [("127.0.0.1", 6379)],},}, }
4. 配置game/routing.py
这一部分的作用相当于http的urls。
内容如下:from django.urls import pathwebsocket_urlpatterns = [ ]
5. 编写game/consumers
这一部分的作用相当于http的views。参考示例:
from channels.generic.websocket import AsyncWebsocketConsumer import jsonclass MultiPlayer(AsyncWebsocketConsumer):async def connect(self):await self.accept()print('accept')self.room_name = "room"await self.channel_layer.group_add(self.room_name, self.channel_name)async def disconnect(self, close_code):print('disconnect')await self.channel_layer.group_discard(self.room_name, self.channel_name)async def receive(self, text_data):data = json.loads(text_data)print(data)
6. 启动django_channels
在~/acapp目录下执行:daphne -b 0.0.0.0 -p 5015 acapp.asgi:application
编写同步函数
canvas渲染文本
this.ctx.font = "20px serif";
this.ctx.fillStyle = "white";
this.ctx.textAlign = "center";
this.ctx.fillText("Hello HelloWorld", x, y);
WebSocket Secure(WSS)概述
WebSocket Secure(WSS)是WebSocket协议的加密版本,通过TLS/SSL加密数据传输,确保通信安全。WSS在WebSocket协议基础上增加了类似HTTPS的安全层,适用于敏感数据(如登录凭证、支付信息)的传输。
WSS与WebSocket的区别
- 安全性:WSS使用TLS/SSL加密,而普通WebSocket(WS)以明文传输数据。
- 端口:WSS默认使用443端口(与HTTPS相同),WS默认使用80端口。
- 协议标识:WSS的URL以
wss://
开头,WS以ws://
开头。
WSS的工作原理
- 握手阶段:客户端通过
wss://
发起连接,服务器返回TLS证书完成验证。 - 加密通道建立:双方协商加密算法,生成会话密钥,后续数据通过该密钥加密。
- 数据传输:加密后的数据以帧形式传输,支持全双工通信。
WSS的优势
- 数据隐私:防止中间人攻击(MITM)和窃听。
- 完整性保护:TLS确保数据未被篡改。
- 兼容性:与现有Web基础设施(如代理、防火墙)兼容。
WSS的适用场景
- 实时聊天应用(如Slack、Discord)。
- 金融交易平台(如股票行情推送)。
- 物联网(IoT)设备的安全控制。
实现WSS的代码示例(Node.js)
const https = require('https'); const WebSocket = require('ws'); const fs = require('fs');const server = https.createServer({cert: fs.readFileSync('path/to/cert.pem'),key: fs.readFileSync('path/to/key.pem') });const wss = new WebSocket.Server({ server });wss.on('connection', (ws) => {ws.on('message', (message) => {console.log('Received: %s', message);});ws.send('Secure connection established'); });server.listen(443);
注意事项
- 证书管理:需使用有效的TLS证书(如Let's Encrypt签发)。
- 性能开销:加密/解密会略微增加延迟,但对现代硬件影响较小。
- 浏览器支持:所有主流浏览器均支持WSS。
WSS是构建安全实时应用的必备技术,尤其在隐私和合规性要求严格的场景中不可或缺。
channels_redis和 Django Channels
channels_redis
是 Django Channels 框架的Redis 后端实现,核心作用是为 Django Channels 提供分布式消息存储和通信支持,解决 Django 传统请求 - 响应模式无法处理的实时通信场景(如 WebSocket、长轮询等)。
核心背景:Django Channels 与 channels_redis
的关系
Django Channels:扩展了 Django 的能力,让 Django 支持非 HTTP 协议(如 WebSocket)和异步任务,实现实时通信。
channels_redis
:作为 Django Channels 的 “后端存储”,负责:存储 Channels 的通道层(Channel Layer) 数据(如用户连接信息、消息队列);
实现多进程 / 多服务器之间的消息同步(例如多台服务器部署时,确保 WebSocket 消息能跨服务器传递)。
简单说:Django Channels 定义了实时通信的 “框架”,channels_redis
提供了底层的 “数据存储和通信能力”(依赖 Redis 数据库)。
主要功能
通道层(Channel Layer)支持
实现 Django Channels 定义的两种核心通道层:Group 通信:将多个用户连接(Channel)分组,支持向整个组广播消息(如聊天室向所有在线用户发消息)。
单 Channel 通信:实现点对点的消息传递(如向特定用户发送私信)。
分布式部署支持
当 Django 项目部署在多台服务器或多进程时,channels_redis
通过 Redis 的分布式特性,确保不同进程 / 服务器的 Channels 能共享消息,避免消息丢失或不同步。消息持久化(可选)
依赖 Redis 的数据存储能力,可配置消息的过期时间,确保短期消息的可靠传递(Redis 重启后消息会丢失,如需持久化需配置 Redis 自身的持久化策略)。