#!/usr/bin/python
# coding=utf8
"""
# Created Time : 2025-02-07 22:20:37
# File Name: command2http.py
# Description:
对[如期]任务做操作时,因涉及到调度服务操作,需要将 COMMAND 请求转为 HTTP 请求,请求本机 server 服务
对[百川]等需要对信号发起操作时,可以通过下面方法转换
"""
import inspect
from conf import config
from xlib import retstat
from xlib.util import http_util
from xlib.util import wrapt
from xlib.util import funcsigs
def convert_command_to_http(app, callback_func=None):
"""
请求本机 server
Args:
app: 表示函数的上级目录,即 RUI 中的 /{app}/{func_name}
callback_func: 回调函数,仅 stat 为 OK 时回调,如输出 table 格式
: callback_func(params, result)
"""
@wrapt.decorator
def wrapper(wrapped, instance, args, kwargs):
"""
wrapper
使用 COMMAND 方式时,均是位置参数, 会都转化为 kargs
"""
# 1. 提取原 func 中的 req 和 user_id 值, 不论使用位置参数还是关键字参数
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"))
# 2. COMMAND 场景,请求本机服务
if req.wsgienv.get("REQUEST_METHOD", "COMMAND") == "COMMAND":
body = kargs
del body["req"]
server_port = config.SERVER_LISTEN_ADDR[1]
endoint = "http://127.0.0.1:{server_port}/{app}/{func_name}".format(server_port=server_port,
app=app,
func_name=wrapped.__name__)
rsp = http_util.post_json(endoint, data=body)
if not rsp.success():
req.error_str = "request local server failed"
return retstat.ERR, {}
result = rsp.json()
# 若请求失败,则从响应 header 中获取下错误信息
if result["stat"] != retstat.OK:
req.error_str = rsp.header.get("x-reason", "")
# 如配置了 callback_func, 则通过 callback 返回数据(stat 为 OK)
if callback_func is not None:
if inspect.isfunction(callback_func):
try:
return callback_func(body, result)
except BaseException:
pass
return result["stat"], result
# 3. HTTP 场景,请求 func
return wrapped(*args, **kwargs)
return wrapper