from xlib.util import wrapt
from xlib.util import funcsigs
from xlib.util import http_util
from xlib.util import config_util
def requested(method, uri):
"""
添加 endpoint
"""
@wrapt.decorator
def wrapper(wrapped, instance, args, kwargs):
"""
wrapper
"""
# 提取原 func 中的 req, 不论使用位置参数还是关键字参数
sig = funcsigs.signature(wrapped)
kargs = dict(zip([k for k in sig.parameters if k not in kwargs], args))
req = kargs.get("req", kwargs.get("req"))
_service_name = "vm_manager"
host = config_util.get_config(req, _service_name, "host")
port = config_util.get_config(req, _service_name, "port")
url = "http://{}:{}{}".format(host, port, uri)
kwargs["method"] = method
kwargs["url"] = url
return wrapped(*args, **kwargs)
return wrapper
------------------------------------------------------example
@requested(method="POST",
uri="/v1/x1Resouce/instance/delete"
)
def resource_delete(req, resource_id, **kwargs):
"""
resource delete
"""
data = {
"instanceIds": [
resource_id
],
"userId": ""
}
headers = {"x_username": "x1_cli"}
r = http_util.request(headers=headers, json=data, **kwargs)
return r
File "py_menu.py", line 46, in main
self.first_menu()
File "py_menu.py", line 102, in first_menu
self.secondary_menu()
File "py_menu.py", line 132, in secondary_menu
fun[1](self.screen, **func_kargs)
File "/home/work/chunfeng/sinan_cli_bak/three_page.py", line 65, in select_node
return _exe_command(screen, service, offsets, action)
File "/home/work/chunfeng/sinan_cli_bak/three_page.py", line 31, in _exe_command
res = http_util.post_json("http://{ip}:5000/sinan/operation".format(ip=nodes[int(offset)]["ip"]), data=data)
File "/home/work/chunfeng/sinan_cli_bak/w_lib/http_util.py", line 99, in post_json
return RequestTool(url, **kwargs)
File "/home/work/chunfeng/sinan_cli_bak/w_lib/http_util.py", line 297, in __init__
res_attr=json.dumps(self.header)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 12: ordinal not in range(128)