celery传参时的对象转换
Posted 腐汝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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__。
Mybatis 中在传参时,${} 和#{} 的区别
- 介绍
MyBatis中使用parameterType向SQL语句传参,parameterType后的类型可以是基本类型int,String,HashMap和java自定义类型。
在SQL中引用这些参数的时候,可以使用两种方式#{parameterName}或者${parameterName}。
- #{}
#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
例如:order by #{parameterName} //或取Map中的value#{Key}也是一样操作。
假设传入参数是“Smith”
会解析成:order by "Smith"
- ${}
$将传入的数据直接显示生成在sql中。
例如:order by #{parameterName} //或取Map中的value#{Key}也是一样操作。
假设传入参数是“Smith”
会解析成:order by Smith
- 概念
- #方式能够很大程度防止sql注入,$方式无法防止Sql注入。
- $方式一般用于传入数据库对象,例如传入表名。
- 从安全性上考虑,能使用#尽量使用#来传参,因为这样可以有效防止SQL注入的问题。
- 重点
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#!
例如:ORDER BY ${columnName} //这里MyBatis不会修改或转义字符串,可实现动态传入排序。
建议:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。
这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。
附加:Map传入判断条件进行动态排序
<!-- 假设: Map<String,Object> map=new HashMap<String,Object>(); map.put("turn","c.ordinaryPrice"); //以商品的普通价格排序 --> <select id="" parameterType="Map" resultType="com.entity.Commodity" > SELECT * FROM commodity c where 1=1 <!-- _parameter.containsKey(‘键‘) 作用:判断键是否存在返回值boolean #{键}取对应的值 !必须三处键值对应,否则取不到值--> <if test="_parameter.containsKey(‘varietyID‘)"> ORDER BY ${turn} </if> </select>
以上是关于celery传参时的对象转换的主要内容,如果未能解决你的问题,请参考以下文章