Copy # coding=utf8
"""
# Description:
api demo
"""
import logging
from xlib import retstat
from xlib.util import wrapt
from xlib.util import funcsigs
from xlib.middleware import funcattr
from xlib.httpgateway import Request
__info = "demo"
__version = "1.0.1"
logger = logging.getLogger("service")
def requested(method):
"""
装饰器:限制请求方法
"""
@wrapt.decorator
def wrapper(wrapped, instance, args, kwargs):
"""
Args:
- wrapped:被装饰的函数或类方法
- instance:
- 如果被装饰者为普通类方法,该值为类实例
- 如果被装饰者为 classmethod 类方法,该值为类
- 如果被装饰者为类/函数/静态方法,该值为 None
- args:调用时的位置参数(注意没有 * 符号)
- kwargs:调用时的关键字参数(注意没有 ** 符号)
"""
# (1) 提取原 func 中的 req, 不论使用位置参数还是关键字参数
sig = funcsigs.signature(wrapped)
# 将位置参数 args 转为 dict kargs
kargs = dict(zip([k for k in sig.parameters if k not in kwargs], args))
req = kargs.get("req", kwargs.get("req"))
if req.wsgienv.get("REQUEST_METHOD") != method:
req.error_str = "method not support"
return retstat.ERR, {}, [(__info, __version)]
return wrapped(*args, **kwargs)
return wrapper
@funcattr.api
@requested("GET")
def hello(req, str_info):
"""
demo
"""
isinstance(req, Request)
logger.info("str_info={str_info}".format(str_info=str_info))
return retstat.OK, {"str_info": str_info}, [(__info, __version)]