首页>>后端>>Python->django怎么调用consumers?

django怎么调用consumers?

时间:2023-12-20 本站 点击:0

导读:很多朋友问到关于django怎么调用consumers的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!

django websocket

做个比喻, 如果说A是服务端, B是客户端, 现在要在A家里吃火锅, 虽然A说你人来就行, 但是B心想总得带点东西过去, 于是去了市场.

先到了蔬菜店, B想买点菠菜, 但又怕A家里已经有了, 于是给A打电话

B: "我带点菠菜过去吧?"

A: "好"

然后挂断. 过一会儿到了水产区

B: "我带点虾过去吧?"

A: "不用"

...如此反复多了之后A突然发现自己确实少准备了一些东西, 于是A给主动给B打了电话

A: "我忘准备蘸料了, 你买点, 然后先别挂掉"

...

A: "再买瓶酒"

...

这就是websocket了

django当让也提供对websocket的支持, 虽然这似乎不是他更擅长的东西. 我们可以通过channels实现websocket连接

诸如上述例子的场景都是合适的场景

举例来说的话比如聊天室, 每个人发送的消息都要实时显示在别人的屏幕上.

比如说数据监控, 波动状态也要实时的呈现在屏幕上, 而不是依赖于使用者自己刷新.

需要安装 channels , asgi_redis , asgiref , channels_redis . 后三个未必都需要装, 记不太清了, 总之安装过程都在channels的使用文档上.

INSTALL_APPS 中需要加上 "channels" , 需要注意的是因为这是一个list, 是有先后顺序的, 最好把它加在第一个.

这里我们的channel通过redis实现, 要在 settings.py 中配置

这里还有点小坑, 官方文档里的hosts不是这种格式, 是 "uri" 这种模式, 但是如果你在设置redis密码时机智的设置了特殊符号( '#$%' 这种), 你就会发现redis的 uri 直接就用不了了, 期间尝试各种方法, 转义什么的也试了都不行, 然后去github上开了个issue, 结果作者说我们是通过 aioredis 连接的, 你去找他们的文档吧....

然后就找到了这种方式.

常规的WSGI不支持websocket, 所以还需要配置ASGI

ASGI_APPLICATION = 'project.routing.application'

同wsgi的配置一样, 这是指向 project 文件夹下 routing.py 文件的 application

这里建议大家跟这官方教程的Tutorial走一遍. 有个比较悲剧的地方就是网上可以搜到许多channels使用指南, 大多都是搭个简易聊天室什么的, 然而你用起来可能发现存在各种报错, 因为channels升了2.0之后更改了一些方法, 而那些教程里基本全都是1.x的版本.

简单说下, 首先 startapp 叫 chat , 假如这里我们没有进行前后端分离, 里面有 templates , 两个 html : index 和 room 分别对应首页和某一个聊天室

新建 consumers.py 来写 websocket 方法

如上, connect 和 disconnect 含义分别如函数名. 因为是聊天室, 所以同一个聊天室内的人应该消息共享, 用 room_group_name 来区分所在的频道.

receive 和 chat_message 是对消息的处理. 当一个用户发送消息时, 前端把消息通过websocket发送过来, receive 收到消息提取关键内容, 通过 chat_message 发送给组内的所有连接. 这时保持连接的所有组内人员都会收到这条消息推送, 前端收到推送再显示在屏幕上.

定义websocket的地址

类似于 django 的 url ( consumers.py 就类似于 views.py ), 同级新建 routing.py

统一用ws/来区分websocket的连接

剩下常规的页面配置和django一样

views.py :

urls.py :

注意: 如果网站是http, 连接使用ws, 如果是https要修改成wss

剩下的自己找资料吧, 笔者对前端了解的不多

本地的话 runserver 就好了, 但是在线上还是得更改启动方式应对高并发.

传统的 uwsgi 不支持 websocket .

gunicorn 好像可以同时支持 websocket , 但是性能不太ok

这里我们用 daphne

这里需要额外开个服务, 专门负责处理websocket.

ingress中要配置路由跳转

如何在django的form验证中如何调用session

使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的.

1,开始标签:#directivename parameter

2,结束标签:/#directivename

3,空标签:#directivename parameter/

django distinct 返回的数据怎么调用

直接利用python提供的json包,在django model的定义中增加一个方法toJSON,利用django model 能访问 _meta.fields 得到相关属性而得到,例子如下:

1

2

3

4

5

6

7

8

9

10

11

12

class Category(models.Model):

autoid = models.AutoField(primary_key=True)

email=models.CharField(max_length=150,blank=False)

comtype=models.CharField(max_length=20,blank=False)

catname=models.CharField(max_length=150,blank=False)

def __unicode__(self):

return '%s' % (self.catname)

def toJSON(self):

import json

return json.dumps(dict([(attr, getattr(self, attr)) for attr in [f.name for f in self._meta.fields]]))

然后用django查出数据,并转换成json,代码如下:

1

2

row=models.Category.objects.get(autoid=23)

print row.toJSON()

Django中使用RPC协议

一、使用所需环境

pip install django-json-rpc

二、在django项目settings配置文件中注册 'jsonrpc'

三、视图中调用

四、注册路由

五、rpc调用对比api调用

Django使用Channels实现WebSSH网页终端,实现SSH堡垒机雏形

更多内容请点击 我的博客 查看,欢迎来访。

本教程基于《Django使用Channels实现WebSocket消息通知功能》

xterm.js : 前端模拟 shell 终端的一个库,当用户每输入一个键,就向后端发送该数据

paramiko : Python 下对 ssh2 封装的一个库,可以使用他来远程连接主机

创建app。名为 webssh

将应用添加到 settings.py

修改应用下的 apps.py

修改应用下的 __init__.py

访问 可以连接到主页

apps/webssh/consumers.py

apps/webssh/routing.py

合并多个应用的url

遇到的问题:用协作连接时,用户加入到一个通道组,往这个通道组发送命令,这个通道所有用户都能收到,来实现协作的功能,但是从 self.ssh_channel 接收返回的数据,可能会存在和预想的不同,特别是 top 命令。示例如下,不知道怎么解决了!!!

参考链接:

【gevent库】

结语:以上就是首席CTO笔记为大家整理的关于django怎么调用consumers的全部内容了,感谢您花时间阅读本站内容,希望对您有所帮助,更多关于django怎么调用consumers的相关内容别忘了在本站进行查找喔。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Python/46047.html