如何将 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 {}
    )
    ...