0%

FastApi开发学习之Depends依赖项介绍

hello 大家好我是Monday,今天给大家带来一篇FastAPI开发Depends依赖项介绍。

前言:

如何去实现。用户在使用我们的接口时,我们想去校验下请求头中的token,请求的key。

1、路径操作装饰器依赖项:

如果有时,我们并不需要在路径操作函数中使用依赖项的返回值。不必在声明路径操作函数的参数时使用 Depends,而是可以在路径操作装饰器中添加一个由 dependencies 组成的 list。具体实现看代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import uvicorn
from fastapi import FastAPI, Header, HTTPException, Depends

app = FastAPI()
fake_items_db = [{"city": "beijing"}, {"city": "shanghai"},
{"city": "heze"}]


def verify_token(token: str = Header(...)):
if token != "zhidingtoken":
raise HTTPException(status_code=400, detail="Token header invalid")


def verify_key(key: str = Header(...)):
if key != "key":
raise HTTPException(status_code=400, detail="Key header invalid")
return key


@app.get("/items/", dependencies=[Depends(verify_token), Depends(verify_key)])
def read_items():
return fake_items_db


if __name__ == '__main__':
uvicorn.run(app="demo1:app", host="0.0.0.0", port=8000)

测试用例:

我们再尝试下不传token或key或传错值,暂时选择token传错值:

我们可以看到无论路径装饰器依赖项是否返回值,路径操作都不会使用这些值。但是这些值都必须携带。

2、全局依赖项:

有时,我们要为整个应用添加依赖项,也就是说应用下的所有接口都要添加依赖项。

那么我们看下,如何去实现,比如我们全局都需要校验token 和key。我们去看下,我们应该如何实现代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import uvicorn
from fastapi import FastAPI, Header, HTTPException, Depends

fake_items_db = [{"city": "beijing"}, {"city": "shanghai"},
{"city": "heze"}]

fake_items_db2 = {
"city1": "beijing",
"city2": "shanghai",
"city3": "heze"
}


def verify_token(token: str = Header(...)):
if token != "zhidingtoken":
raise HTTPException(status_code=400, detail="Token header invalid")


def verify_key(key: str = Header(...)):
if key != "key":
raise HTTPException(status_code=400, detail="Key header invalid")
return key


app = FastAPI(dependencies=[Depends(verify_token), Depends(verify_key)])


@app.get("/items/")
def read_items():
return fake_items_db


@app.get("/items/{city}")
def read_items(city: str):
return fake_items_db2[city]


if __name__ == '__main__':
uvicorn.run(app="demo2:app", host="0.0.0.0", port=8000)

我们依次测试访问这两个接口,看看是否都有依赖:

我们先都正常访问:

我们咋依次用错误的token和key分别访问这两个端口:

ok ,成功设置了全区依赖

3、依赖项成功访问函数需要返回值:

如果有时,我们需要在路径操作函数中使用依赖项的返回值,我们该如何操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import uvicorn
from fastapi import FastAPI, Header, HTTPException, Depends
from typing import Optional
from pydantic import BaseModel


class UserReturn(BaseModel):
id: Optional[int] = None
username: Optional[str] = None
full_name: Optional[str] = None
disabled: Optional[bool] = False


def verify_token(token: str = Header(...)):
if token != "token":
raise HTTPException(status_code=400, detail="Token header invalid")
return UserReturn(**{"id": 1, "username": "菜鸟童靴", "full_name": "Monday最帅"})


app = FastAPI()


@app.get("/items/", )
def read_items(user_info: UserReturn = Depends(verify_token)):
return user_info


if __name__ == '__main__':
uvicorn.run(app="demo3:app", host="0.0.0.0", port=8000)

我们传入正确的token测试下是否有返回值:

我们传入错误正确的token测试下是否有返回值:

项目完整代码:

BoyYongXin/wx_pub_article_code: 博客发文使用的代码 (github.com)

结束语

​ 今天的分享就到这里了,欢迎大家关注微信公众号”菜鸟童靴