使用 websocket 实现实时 web 应用可以使你的应用程序具备实时双向通信的能力。以下是一个完整的指南,展示如何使用 django channels 和 websocket 实现一个简单的实时 web 应用。
环境准备
安装 django channels:
pip install channels
创建 django 项目:
django-admin startproject myproject cd myproject
创建应用:
python manage.py startapp myapp
配置 django 项目
添加应用到 installed_apps:
在 myproject/settings.py 中,添加 channels 和你的应用 myapp:
installed_apps = [
...
'channels',
'myapp',
]配置 channels:
在 settings.py 中,添加 channels 配置:
asgi_application = 'myproject.asgi.application'
channel_layers = {
"default": {
"backend": "channels.layers.inmemorychannellayer",
},
}创建 asgi.py 文件:
在 myproject 目录下创建一个 asgi.py 文件:
import os
from channels.routing import protocoltyperouter, urlrouter
from django.core.asgi import get_asgi_application
from channels.auth import authmiddlewarestack
import myapp.routing
os.environ.setdefault('django_settings_module', 'myproject.settings')
application = protocoltyperouter({
"http": get_asgi_application(),
"websocket": authmiddlewarestack(
urlrouter(
myapp.routing.websocket_urlpatterns
)
),
})创建 websocket 路由
定义 websocket 路由:
在 myapp 目录下创建一个 routing.py 文件:
from django.urls import path
from . import consumers
websocket_urlpatterns = [
path('ws/chat/', consumers.chatconsumer.as_view()),
]创建消费者
定义 websocket 消费者:
在 myapp 目录下创建一个 consumers.py 文件:
import json
from channels.generic.websocket import asyncwebsocketconsumer
class chatconsumer(asyncwebsocketconsumer):
async def connect(self):
await self.accept()
async def disconnect(self, close_code):
pass
async def receive(self, text_data):
text_data_json = json.loads(text_data)
message = text_data_json['message']
await self.send(text_data=json.dumps({
'message': message
}))创建前端页面
创建 html 页面:
在 myapp/templates/myapp 目录下创建一个 chat.html 文件:
<!doctype html>
<html>
<head>
<title>chat</title>
</head>
<body>
<h1>websocket chat</h1>
<input id="messageinput" type="text" size="100">
<button onclick="sendmessage()">send</button>
<ul id="messages">
</ul>
<script>
const chatsocket = new websocket(
'ws://' + window.location.host + '/ws/chat/'
);
chatsocket.onmessage = function(e) {
const data = json.parse(e.data);
document.queryselector('#messages').innerhtml += '<li>' + data.message + '</li>';
};
chatsocket.onclose = function(e) {
console.error('chat socket closed unexpectedly');
};
function sendmessage() {
const messageinputdom = document.queryselector('#messageinput');
const message = messageinputdom.value;
chatsocket.send(json.stringify({
'message': message
}));
messageinputdom.value = '';
}
</script>
</body>
</html>创建视图:
在 myapp/views.py 中创建一个视图来渲染模板:
from django.shortcuts import render
def chat(request):
return render(request, 'myapp/chat.html')配置 url:
在 myapp/urls.py 中添加 url 路由:
from django.urls import path
from . import views
urlpatterns = [
path('chat/', views.chat, name='chat'),
]运行服务器
启动开发服务器:
python manage.py runserver
测试 websocket:
访问 http://127.0.0.1:8000/chat/,在输入框中输入消息并点击 “send” 按钮,你应该会看到消息实时显示在页面上。
总结
通过上述步骤,你可以使用 django channels 和 websocket 创建一个简单的实时 web 应用。django channels 提供了强大的功能,使得在 django 中实现实时功能变得更加容易。你可以在此基础上扩展,添加更多功能和复杂的逻辑。
到此这篇关于python使用websocket实现实时web应用的文章就介绍到这了,更多相关python使用websocket内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论