celery传参时的对象转换
遇到一个有趣的问题,celery delay传入SSH的对象时,报错Object of type SSH is not JSON serializable,分析一下就是只能传json的数据。把所有传入的数据都转成json。
1、因为我传递的是对象,所以要把对象转成json,所以我就自定义了一个JSONEncoder
class MyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, SSH): obj.__dict__['arguments']['pkey'] = None return obj.__dict__
2、在异步任务里面又将json转成对象
@app.task(name='receive_execute_command', base=CustomTask) def execute_remote_command(client: json, scripts: str): """ 异步执行远程脚本 :param client: :param scripts: :return: """ client_json_to_dict = json.loads(client) client_json_to_dict['arguments']['pkey'] = SSH.get_private_key() new_client_obj = SSH(hostname='none', password='none') new_client_obj.__dict__ = client_json_to_dict res = new_client_obj.exec_command(scripts, timeout=5) return res[1].decode('utf-8')
3、这是调用异步的片段
elif is_async: client_to_json = json.dumps(client, cls=MyEncoder, indent=4) execute_remote_command.delay(client_to_json, scripts) return ['0', '异步执行中。'.encode('utf-8')]
4、总结下来难点就是对象与json之间的互转。希望能帮助到各位大侠。
5、扩展一下__dict__ (magic方法)
为了方便用户查看类中包含哪些属性,Python 类提供了 __dict__ 属性。需要注意的一点是,该属性可以用类名或者类的实例对象来调用:
1)用类名直接调用 __dict__,会输出该由类中所有类属性组成的字典;
2)而使用类的实例对象调用 __dict__,会输出由类中所有实例属性组成的字典。
对于具有继承关系的父类和子类来说,父类有自己的 __dict__,同样子类也有自己的 __dict__,它不会包含父类的 __dict__。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)