介绍
这篇文章给大家分享的是有关Django + Vue如何实现WebSocket连接的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
<>强效果强>
测试<代码> ping www.baidu.com 代码>效果
点击连接建立ws连接
<强>后端实现强>
<强>所需软件包强>
后端主要借助Django <代码>频道> 代码实现插座连接,官网文档链接
这里想实现每个连接进来加入组进行广播,所以还需要引入<代码> channels-redis> 代码。
pip
==2.2.0渠道 channels-redis==测试盒框
<强>引入强>
设置。py
INSTALLED_APPS =, ( & # 39;才能django.contrib.admin& # 39; & # 39;才能django.contrib.auth& # 39; & # 39;才能django.contrib.contenttypes& # 39; & # 39;才能django.contrib.sessions& # 39; & # 39;才能django.contrib.messages& # 39; & # 39;才能django.contrib.staticfiles& # 39; & # 39;才能rest_framework.authtoken& # 39; & # 39;才能rest_framework& # 39; ,,,,,,,… & # 39;才能频道# 39; ] #,复述,配置 时间=REDIS_HOST ENV_DICT.get (& # 39; REDIS_HOST& # 39;,, & # 39; 127.0.0.1 # 39;) 时间=REDIS_PORT ENV_DICT.get (& # 39; REDIS_PORT& # 39;,, 6379) CHANNEL_LAYERS =, { “default"才能:,{ ,,,“BACKEND":,“channels_redis.core.RedisChannelLayer" ,,,“CONFIG":, { ,,,,,“hosts":, (REDIS_PORT REDIS_HOST也), ,,,}, ,,}, }
代码
应用程序/消费者。py
新建一个消费处理
实现:默认连接加入组,发送信息时的处理。
得到channels.generic.websocket import WebsocketConsumer class MyConsumer (WebsocketConsumer): def 才能连接(自我): ,,,,,, ,,,每个任务作为一个频道 ,,,默认进入对应任务执行频道 ,,,,,, ,,,self.job_name =, self.scope [& # 39; url_route& # 39;] [& # 39; kwargs& # 39;] [& # 39; job_name # 39;】 ,,,self.job_group_name =, & # 39; job_ % & # 39;, % self.job_name ,,,async_to_sync (self.channel_layer.group_add) ( ,,,,,self.job_group_name, ,,,,self.channel_name ,,,) ,,,self.accept () def 才能断开(自我,close_code): ,,,async_to_sync (self.channel_layer.group_discard) ( ,,,,,self.job_group_name, ,,,,self.channel_name ,,,) #,才能job.message类型处理 def 才能job_message(自我,事件): ,,,#,默认发送收到信息 ,,,self.send (text_data=https://www.yisu.com/zixun/event[“文本”])
应用程序/routing.py
ws类型路由
实现:ws/工作/& lt; job_name>由<代码> MyConsumer> 代码去处理。
得到只import 消费者 得到django.urls import 路径 得到channels.routing import ProtocolTypeRouter URLRouter 得到channels.sessions import  SessionMiddlewareStack 时间=application ProtocolTypeRouter ({ & # 39;才能websocket # 39;:, SessionMiddlewareStack ( ,,,URLRouter ( ,,,,( ,,,,,,路径(& # 39;ws/工作/& lt; str: job_name> & # 39;,, consumers.MyConsumer) ,,,,) ,,,) ),才能 })
应用程序/观点。py
在执行命令中获取<代码> webSocket 代码>消费通道,进行异步推送
- <李>
使用异步推送async_to_sync是因为在连接的时候采用的异步连接,所以推送必须采用异步推送。
李> <李>因为执行任务时间过长,启动触发运行时加入多线程,直接先返回好,后端运行任务。
李>得到subprocess import Popen管 import 线程 def runPopen(工作): “才能”;“ ,,执行命令,返回popen “才能”;“ path 才能=os.path 时间=Path 才能;path.abspath (path.join (BASE_DIR, path.pardir)) script_path 才能=,path.abspath (path.join(路径,& # 39;run.sh& # 39;)) cmd =,才能“sh % s % s", %, (script_path,,工作) return 才能Popen (cmd, shell=True, stdout=管,stderr=管) def runScript(工作): 时间=channel_layer 才能;get_channel_layer () group_name =,才能“job_ % s" %,工作 时间=popen 才能;runPopen(工作) while 才能正确的: ,,,output =, popen.stdout.readline () ,,,if output ==, & # 39; & # 39;,以及popen.poll (), is not 没有: ,,,,,休息 ,,,if 输出: null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null nullDjango + Vue如何实现WebSocket连接