如何将 args 和 kwargs 传递给使用 FastAPI 构建的 REST 端点?
How do I pass args and kwargs to a REST endpoint built with FastAPI?
我正在使用 FastAPI 构建 REST api。目标是 运行 网络上的 python 函数和 return 结果。
请注意,我可以修改客户端和服务器代码。
高级代码是:
@app.post('/my_endpoint')
def serve_data(q:dict):
return foo(*q.get('args', []), **q.get('kwargs', {}))
其中 foo 是一些复杂的 Python 函数,需要大量的 args 和 kwargs。
我在客户端使用:
def get_data(endpoint:str='my_endpoint', args:list=None, kwargs:dict=None)->pd.DataFrame:
q = dict(
args = args if args else [],
kwargs = kwargs if kwargs else {}
)
qj = json.dumps(q)
response = requests.post(url = f'http://my_url/{endpoint}', data=qj)
data = response.json()
df = pd.read_json(data)
return df
代码有效,但我不喜欢必须使用显式 args 和 kwargs 调用 get_data
。
例如
get_data(args=['A', 19, 99], kwargs={'date': '2021-01-01', 'font_size': 2})
我希望能够将 args 和 kwargs“传递”到 get_data
一直到 foo
。
上面的代码会变成:
get_data('A', 19, 99, date='2021-01-01', font_size=2)
# ie. the same signature as `foo`
# On the server this is run:
# foo('A', 19, 99, date='2021-01-01', font_size=2)
有什么想法吗?
您可以像这样简单地定义您的函数:
def get_data(endpoint:str='my_endpoint', *args, **kwargs)->pd.DataFrame:
q = dict(
args = list(args) if args else [],
kwargs = kwargs if kwargs else {}
)
...
我正在使用 FastAPI 构建 REST api。目标是 运行 网络上的 python 函数和 return 结果。
请注意,我可以修改客户端和服务器代码。
高级代码是:
@app.post('/my_endpoint')
def serve_data(q:dict):
return foo(*q.get('args', []), **q.get('kwargs', {}))
其中 foo 是一些复杂的 Python 函数,需要大量的 args 和 kwargs。
我在客户端使用:
def get_data(endpoint:str='my_endpoint', args:list=None, kwargs:dict=None)->pd.DataFrame:
q = dict(
args = args if args else [],
kwargs = kwargs if kwargs else {}
)
qj = json.dumps(q)
response = requests.post(url = f'http://my_url/{endpoint}', data=qj)
data = response.json()
df = pd.read_json(data)
return df
代码有效,但我不喜欢必须使用显式 args 和 kwargs 调用 get_data
。
例如
get_data(args=['A', 19, 99], kwargs={'date': '2021-01-01', 'font_size': 2})
我希望能够将 args 和 kwargs“传递”到 get_data
一直到 foo
。
上面的代码会变成:
get_data('A', 19, 99, date='2021-01-01', font_size=2)
# ie. the same signature as `foo`
# On the server this is run:
# foo('A', 19, 99, date='2021-01-01', font_size=2)
有什么想法吗?
您可以像这样简单地定义您的函数:
def get_data(endpoint:str='my_endpoint', *args, **kwargs)->pd.DataFrame:
q = dict(
args = list(args) if args else [],
kwargs = kwargs if kwargs else {}
)
...