django使用channle实现websocket实时展示脚本日志

功能:实现页面执行脚本,实时展示脚本执行过程。
环境: python3.6.2 django2.2
实现:
刚开始用的dwebsocket,结果发现无法传输中文字符,没找到解决办法,去github上才发现已经停止维护了....,推荐channel,作为一个二把刀的运维开发,真是浪费不少时间。
安装:预留
官网链接里,实现了聊天室的功能,按照官网一步步走,可以顺利实现。
看的知乎上的例子,照猫画虎是实现了,结果发现不是实时的,重新看官网,结果改为异步的方式实现实时的了
贴下不一样的代码出,有时间再完善吧,太晚了...

from channels.generic.websocket import AsyncWebsocketConsumer
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
from users.models import Clients

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        user_id = self.scope['user'].id
        client = Clients.objects.get_or_create(user_id=user_id)[0]
        client.channel_name = self.channel_name
        client.save()
        await self.accept()

    async def disconnect(self, close_code):
        Clients.objects.filter(channel_name=self.channel_name).delete()

    async def send_message(self,event):
        await self.send(text_data=event["text"])

def notify(user_id,message):
    channel_layer = get_channel_layer()
    channel_name = Clients.objects.get(user_id=user_id).channel_name
    async_to_sync(channel_layer.send)(channel_name,{
        "type":"send.message",
        "text": '{"message":"%s"}'%message,
    })

参考链接:
官网:https://channels.readthedocs.io/en/stable/
例子:https://zhuanlan.zhihu.com/p/43102770

posted @ 2020-12-12 02:08  centosboy  阅读(342)  评论(0)    收藏  举报