这个博客主要写的是在Django框架中使用websocket,Django项目的创建和基本的配置已经算在前期环境配置,如果没有了解过Django使用的小伙伴请先看其他文章,简单学习以下Django的使用。
目录
前期环境配置
- 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测试网站测试 EasySwoole-WebSocket在线测试工具,我的控制台输出:
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
测试成功了