handler 类型

3.3 handler 处理函数自定义属性控制

3.3.1 自定义属性

is_parse_post: 是否解析请求中 post body 中的参数,默认值:True

post_len = wsgienv.get("CONTENT_LENGTH")
wsgienv["wsgi.input"].read(post_len)

is_encode_response: 是否重新拼装 response,并自动转为 json, 默认值:False

如:
retstat.OK, {"randstr": randstr}, [(__info__, __version__)]
             |
             V
HTTP_CODE:200
HTTP_BODY:{"stat":"OK","randstr":randstr}
HTTP_HEADERS: (info, version)

3.3.2 根据 hander 特定目录定义属性(已 pass)

定义 handlers.x 开头的设置 is_parse_post, is_encode_response 为 True,True, 其他为 True,False

def autoload_handler(self, package_dir):
    """自动加载指定目录下的所有 package
    Args:
        package_dir: package dir
    """
    # 将 "handlers" 目录下的 package 自动加载,也就是 __init__.py
    results = import_submodules(package_dir)
    for package_name in results:
        # 如果 package_name 是以 {package_dir}.x 开头,则说明为简易接口函数
        if package_name.startswith("{package_dir}.x".format(package_dir=package_dir)):
            adder_args = [True, True]
        else:
            adder_args = [True, False]
        self.add_apis(
            results[package_name],
            adder_args,
            package_name=package_name)

使用特定目录定义属性在使用上不是特别方便,方案已 pass

3.3.3 使用装饰器进行自定义属性

api

# 解析 body 中的 json,并转为字典,以参数传给 handler 方法
## (1) 假如 body 中的内容不是 json,会报 {"stat": "ERR_BAD_PARAMS"} 错误
## (2) http 请求 URL 中的 get 请求参数和post 中 body 中的数据会同时生效 
is_parse_post: True

# 是否将 handler 方法中返回的 dict 序列化为 json,并使用 utf-8 编码
is_encode_response: True

api_upload

# 仅仅将请求 URL 中的 get 请求参数转为 handler 中的参数
is_parse_post: False
is_encode_response: True

api_download(默认值)

is_parse_post: True
is_encode_response: False
from xlib.middleware import funcattr
@funcattr.api
def ping(req):
    ...

Last updated