运行环境参考
1. python 3.9
2. daphne 4.0.0
3. channels 4.0.0
4. Django 4
第一步
安装上面的运营环境,特别是用Anaconda中,这个简单 pip install 统统解决,
第二步
打开项目的配置文件
setting.py
找到
INSTALLED_APPS
配置项,进行应用注册:
如果实在不知道怎么搞,复制粘贴即可,如:
INSTALLED_APPS = [
'daphne', #这是要你添加的
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
'channels',#这是要你添加的
]
# websocket配置
ASGI_APPLICATION = '你自己的django项目名称.asgi.application' #这是要你添加的
第三步
打开django项目配置包中的
asgi.py
文件,进行修改:
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
# 导入chat应用中的路由模块
from 你的应用名称 import routings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django项目名称.settings')
application = ProtocolTypeRouter({
# 当存在http请求时,路由走这里
"http": get_asgi_application(),
# 当存在websocket请求时,将请求交给指定应用中的路由模块处理
"websocket": URLRouter(routings.socket_urlpatterns)
})
第四步
如果你有应用就直接在应用目录下创建一个
routings.py
文件,没有应用就先创建应用(注意创建应用还得去注册应用哦)
创建应用命令
# 创建应用
python manage.py startapp 应用名称
routings.py文件复制下面代码
from django.urls import path
# 当前文件同级目录下创建consumers.py文件
from . import consumers
# 这个变量是存放websocket的路由
socket_urlpatterns = [
path('访问路由', consumers.方法类名.as_asgi()),
]
第五步
routings.py
文件同级目录下创建
consumers.py
文件,粘贴下列代码:
from channels.generic.websocket import WebsocketConsumer
from channels.exceptions import StopConsumer
from asgiref.sync import async_to_sync
class 自己取个类名(WebsocketConsumer):
def websocket_connect(self, message):
# 客户端与服务端进行握手时,会触发这个方法
# 服务端允许客户端进行连接,就是握手成功
self.accept()
def websocket_receive(self, message):
# 接收到客户端发送的数据
recv = message.get('text')
print('接收到的数据,', recv)
if recv == 'close':
# 服务的主动断开连接
print('服务器断开连接')
self.close()
else:
# 客户端向服务端发送数据
self.send("服务器收到你的来信")
def websocket_disconnect(self, message):
# 客户端端口连接时,会触发该方法,断开连接
print('客户端断开连接')
raise StopConsumer()
终极步骤
命令行运行项目:
python manage.py runserver 0.0.0.0:8000
验证是否成功:
网站接口测试
可以使用这个网站:
http://www.easyswoole.com/wstool.html
版权声明:本文为weixin_42332166原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。