如何从使用FastAPI的请求返回多个值?



我试图使用FastAPI + MongoDB创建一个API,可以从请求返回多个值。MongoDB充满了数据,使用mongoengine,我可以在向特定端点发送请求时咨询一个或所有数据。我现在要做的是从端点接收一个或多个数据,例如:

当咨询端点http://127.0.0.1:8000/rice时,我得到一个JSON响应,其中包含MongoDB上该项目的所有数据。但问题是,我需要有这个端点从MongoDB咨询一个或多个数据,并返回尽可能多的数据作为用户发送到端点,例如:http://127.0.0.1:8000/rice&pasta&bean和返回JSON的信息,它是在MongoDB关于rice,pastabean

在代码中,我有一个main.py,其路由如下:
@app.get('/{description}', status_code=200)
def get_description(description):
return JSONResponse(TabelaService().get_description(description))

这个函数调用另一个函数,这个函数调用另一个函数,这个函数使用queryset从MongoDB查询数据并序列化它:

def get_description(self, description):
try:
description = TabelaNutricional.get_by_description(description)
return self.serialize(description)
except:
raise DescriptionNotFound

下面是从MongoDB获取数据的函数:

@queryset_manager
def get_by_description(doc_cls, queryset, description):
nutriente = queryset(description=str(description)).get()
return nutriente

有没有人知道如何在端点中获得更多数据?谢谢你!

您可以声明一个类型为List的查询参数,并显式地使用Query,如这个和这个答案所示,并在文档中解释。通过这种方式,您可以为查询参数接收多个值,例如

http://127.0.0.1:8000/?item=rice&item=pasta&item=bean 

在服务器端,您可以遍历项列表并为列表中的每个项调用函数,并创建一个字典,将结果发送回客户端。例如:

@app.get('/', status_code=200)
def get_description(item: List[str] = Query(...)):
data = {}
for i in item:
d = TabelaService().get_description(i)
data[i] = d

return JSONResponse(data)

如果您仍然想使用Path参数,您可以使用下面的并调用它,如您的问题所示,即http://127.0.0.1:8000/rice&pasta&bean:

@app.get('/{items}', status_code=200)
def get_description(items: str):
items = items.split('&')
data = {}
for i in items:
d = TabelaService().get_description(i)
data[i] = d

return JSONResponse(data)

注意:如果使用上面的方法(带path参数),将无法加载http://127.0.0.1:8000/docs上的OpenAPI文档(Swagger UI)。这是因为在访问该URL时,将调用上面的端点,并将docs作为items路径参数的值。因此,您可以在该端点上添加一个额外的路径,例如,@app.get('/api/{items}',并使用http://127.0.0.1:8000/api/rice&pasta&bean调用它(从而允许/docs成功加载),或者使用Query参数的第一种方法。

最新更新