为什么 FastAPI 的 Depends() 可以在没有任何参数传递给它的情况下工作?



我发现了以下FastAPI代码,用于使用从表单获得的信息对用户进行身份验证:

@app.post("/token")
async def login_for_access_token(form_data:OAuth2PasswordRequestForm = Depends(),
db: Session = Depends(get_db)):
user = authenticate_user(form_data.username, form_data.password, db)
if not user:
raise token_exception()

token_expires = timedelta(minutes=20)

token = create_access_token(user.username,
user.id,
expires_delta=token_expires)
return {"token": token}

我正在努力理解为什么在form_data:OAuth2PasswordRequestForm = Depends(),Depends()没有参数传递给它?我认为Depends()的全部要点是用一个函数实例化,该函数在调用端点函数之前被调用。

为了避免代码重复FastAPI允许将依赖声明为参数的type,并且使用Depends()而不使用其中的任何参数。例如:

form_data: OAuth2PasswordRequestForm = Depends()

因此,既然已经将OAuth2PasswordRequestForm声明为form_data参数的type,那么就没有必要再将其传递给Depends()了。

根据FastAPI的文档:

快捷方式但是你看到我们这里有一些代码重复,写了两次CommonQueryParams:

commons: CommonQueryParams = Depends(CommonQueryParams)

FastAPI提供了一个快捷方式对于这些情况,在哪里依赖项,特别是是FastAPI将"调用"的类。来创建类本身的实例。

对于这些特定的情况,您可以执行以下操作:

不写:

commons: CommonQueryParams = Depends(CommonQueryParams)

…你写:

commons: CommonQueryParams = Depends()

将依赖项声明为参数的类型,然后使用Depends()作为默认值值(=之后的值)函数的参数,在Depends()中没有任何参数,而不是必须重新编写完整的类Depends(CommonQueryParams).

最新更新