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