我有一个 FastAPI 函数定义为:
@app.post("/rating")
def read_prediction(id: int, team: int, location: float, age: float):
当我收到 POST 请愿书时,问题就开始了,其中预定义参数之一没有值,如下所示:
*"POST /rating?id=27691&team=1673&location=328&age= HTTP/1.1" 422*
有了这个请求,就不进入函数了。我尝试过不同的选项,例如引入默认值,但它不起作用。
@app.post("/rating")
def read_prediction(id: int, team: int, location: float, age: float = 26.5):
还有可选的
from typing import Optional
def read_prediction(id: int, team: int, location: float, age: Optional[float] = 26.5):
但是我无法处理这个异常。当 POST 请愿书包含年龄时,该函数将按预期工作。
我一直在考虑的另一个解决方案是定义多个函数,不带参数可以为空,但我不知道这是否是解决它的最佳方法。
即使你的目的是发帖,如果你把帖子改成获取也可以,但没有意义。同样,由于您的意图是发布,因此您应该使用here给出的模型,或者如果您希望在请求正文中添加每个参数的正文,或者如果您希望在查询参数中添加查询,甚至两者都添加!
from fastapi import Path, Body, Query
@app.post("/rating")
def read_prediction(id: int = Query(...), age: float = Body(None)):
"""
... -> mandatory or None for optional
"""
在 fn 参数本身中添加默认值(26.5 或任何其他值)并不好,而是根据需要在 fn 内部进行
只需从您的网址中删除
&age=
,如果这是不可能的或类似的事情,则从您的fastapi代码中删除数据类型
@app.post("/rating")
def read_prediction(id: int, team: int, location: float, age):
这会很好地工作,如果您确实想应用数据类型,则创建模型并接受数据作为带有所有验证的请求正文。