Django + Vue如何实现WebSocket连接

  介绍

这篇文章给大家分享的是有关Django + Vue如何实现WebSocket连接的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

<>强效果

测试<代码> ping www.baidu.com 效果

点击连接建立ws连接

 Django + Vue如何实现WebSocket连接

<强>后端实现

<强>所需软件包

后端主要借助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   null

Django + Vue如何实现WebSocket连接