阿里云服务器 内网ip
本文分享自华为云社区《
结合Django中的WebSockets和异步视图实现实时通信功能的完整指南-云社区-华为云》,作者: 柠檬味拥抱。
在现代Web应用程序中,实时通信已经成为了必不可少的功能之一。无论是在线聊天、实时数据更新还是实时通知,都需要通过实时通信技术来实现。Django作为一个强大的Web框架,提供了许多工具来构建各种类型的Web应用程序,但是在实时通信方面,传统的请求-响应模式显然无法满足需求。在这篇文章中,我们将探讨如何利用Django中的WebSockets和异步视图来实现实时通信功能。
WebSockets简介
WebSockets是一种在单个TCP连接上提供全双工通信的协议。与HTTP请求-响应模式不同,WebSockets允许服务器和客户端之间进行持续的双向通信,从而实现了实时性。在Django中,我们可以使用第三方库django-channels来实现WebSocket的支持。
异步视图
Django 3.1引入了异步视图的支持,使得我们可以编写异步处理请求的视图函数。这对于处理长时间运行的任务或需要等待外部资源响应的请求非常有用。
结合WebSockets与异步视图
下面我们将通过一个案例来演示如何在Django中结合WebSockets和异步视图来实现实时通信功能。假设我们正在开发一个简单的实时聊天应用。
安装依赖
首先,我们需要安装django-channels库:
pipinstall channels配置项目
在项目的settings.py中,添加channels应用:
INSTALLED_APPS= [ ...channels, ... ]然后,创建一个名为routing.py的新文件,在其中定义WebSocket路由:
routing.pyfromchannels.routingimportProtocolTypeRouter, URLRouterfromchannels.authimportAuthMiddlewareStackfromdjango.urlsimportpathfrommyapp.consumersimportChatConsumer websocket_urlpatterns = [ path(ws/chat/, ChatConsumer.as_asgi()), ] application = ProtocolTypeRouter({websocket: AuthMiddlewareStack( URLRouter( websocket_urlpatterns ) ), })创建Consumer
接下来,我们创建一个消费者(Consumer)来处理WebSocket连接:
consumers.pyimport json from channels.generic.websocket import AsyncWebsocketConsumerclassChatConsumer(AsyncWebsocketConsumer):asyncdefconnect(self):self.room_name =chat_roomself.room_group_name = fchat_{self.room_name}加入聊天室群组awaitself.channel_layer.group_add(self.room_group_name,self.channel_name ) awaitself.accept() asyncdefdisconnect(self, close_code):离开聊天室群组awaitself.channel_layer.group_discard(self.room_group_name,self.channel_name ) asyncdefreceive(self, text_data): text_data_json = json.loads(text_data) message = text_data_json[message]发送消息到聊天室群组awaitself.channel_layer.group_send(self.room_group_name, {type:chat_message,message: message } ) asyncdefchat_message(self, event): message = event[message]发送消息给WebSocket连接awaitself.send(text_data=json.dumps({message: message }))编写前端代码
在前端页面中,我们需要使用JavaScript来连接WebSocket并处理消息的发送和接收:
// chat.jsconstchatSocket =newWebSocket(ws://localhost:8000/ws/chat/); chatSocket.onmessage =function(e){constdata =JSON.parse(e.data);constmessage = data[message];// 处理收到的消息console.log(message); }; chatSocket.onclose =function(e){console.error(Chat socket closed unexpectedly); };document.querySelector(chat-message-input).addEventListener(keypress,function(e){if(e.key ===Enter) {constmessageInputDom =document.querySelector(chat-message-input);constmessage = messageInputDom.value; chatSocket.send(JSON.stringify({message: message })); messageInputDom.value =; } });集成到模板
最后,我们在Django模板中集成JavaScript代码:
html><html><head><title>Chat