配置handler

有时候还需要对保存的配置进行进一步处理,以获得最终需要的配置,因此引入了handler的概念。

保存配置时会把 v2_config 中的类型为dict且含有 _handler 这个key的那部分,经过handler处理后整个替换掉。 如果存在多层嵌套,会先处理最里层的数据。

如:

{
   "url":{
       "_handler":"v2_url_handler",
       "type":"tag",
       "value":"1"
   }
}

经v2_url_handler处理后,变成:

// 注意这里替换的是与"_handler"同级的整个结构
{
   "url" : "/tag/1"
}

自带handler

自带了3个handler,分别是 :

  • v2_url_handler :返回分类、标签的url

  • v2_img_handler : 返回生成图片标签所以的结构

  • v2_kv_handler : 把数组的k-v结构解析为字典结构

自定义handler

  1. 新建一个python包,以及py文件,

my_ex/
    __init__.py
    custom_handler.py
  1. 把你的py文件加入 settings_local.pyCUSTOM_CONFIG_HANDLER

CUSTOM_CONFIG_HANDLER=['my_ex.custom_handler']
  1. 编写一个你的handler类,继承 app.deeru_config_handler.base.BaseHandler,并重写 calculate()

    装饰器 deeru_config_handler() 用于定义handler的名字,防止冲突建议格式为:你的名字:handler名字

from app.deeru_config_handler.base import BaseHandler, deeru_config_handler

@deeru_config_handler('gojuukaze:textHandler')
class TextHandler(BaseHandler):
"""
args:
{
   '_handler':'gojuukaze:textHandler',
   'text':'xxx'
}

返回
{
    'text':'xx',
}
"""
def calculate(self):
    text = self.args['text']

    return {
        'text': text,
    }

至此你已经成功编写了一个handler,载入handler需要重启工程

注解

函数 calculate() 并没有限制返回的数据类型,你可以返回字符串、字典等

要测试你写的handler,可以用 get_real_config() 函数

In [1]: from app.manager.config_manager_v2 import get_real_config
In [2]: get_real_config({'_handler':'gojuukaze:textHandler','text':'123'})

Out[2]: {'text': '123'}