我发现了以下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)
.