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__。

可以参考:http://c.biancheng.net/view/2374.html

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

  • 概念
  1. #方式能够很大程度防止sql注入,$方式无法防止Sql注入。
  2. $方式一般用于传入数据库对象,例如传入表名。
  3. 从安全性上考虑,能使用#尽量使用#来传参,因为这样可以有效防止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传参时的对象转换的主要内容,如果未能解决你的问题,请参考以下文章

传参时Url中有中文报错

c语言 指针传参

mybatis在传参时,为啥#能够有效的防止sql注入

Mybatis 中在传参时,${} 和#{} 的区别

小程序函数传参时{}的作用

微信小程序页面跳转url传参,对象、数据过长、特殊字符问题