新聞中心
在上一章節(jié)中,(基于依賴項注入系統(tǒng)的)安全系統(tǒng)向路徑操作函數(shù)提供了一個 str 類型的 token:

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比樂平網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式樂平網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋樂平地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。
from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.get("/items/")
async def read_items(token: str = Depends(oauth2_scheme)):
return {"token": token}
但這還不是很實用。
讓我們來使它返回當前用戶給我們。
創(chuàng)建一個用戶模型
首先,讓我們來創(chuàng)建一個用戶 Pydantic 模型。
與使用 Pydantic 聲明請求體的方式相同,我們可以在其他任何地方使用它:
from typing import Optional
from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class User(BaseModel):
username: str
email: Optional[str] = None
full_name: Optional[str] = None
disabled: Optional[bool] = None
def fake_decode_token(token):
return User(
username=token + "fakedecoded", email="john@example.com", full_name="John Doe"
)
async def get_current_user(token: str = Depends(oauth2_scheme)):
user = fake_decode_token(token)
return user
@app.get("/users/me")
async def read_users_me(current_user: User = Depends(get_current_user)):
return current_user
創(chuàng)建一個 get_current_user 依賴項
讓我們來創(chuàng)建一個 get_current_user 依賴項。
還記得依賴項可以有子依賴項嗎?
get_current_user 將具有一個我們之前所創(chuàng)建的同一個 oauth2_scheme 作為依賴項。
與我們之前直接在路徑操作中所做的相同,我們新的依賴項 get_current_user 將從子依賴項 oauth2_scheme 中接收一個 str 類型的 token:
from typing import Optional
from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class User(BaseModel):
username: str
email: Optional[str] = None
full_name: Optional[str] = None
disabled: Optional[bool] = None
def fake_decode_token(token):
return User(
username=token + "fakedecoded", email="john@example.com", full_name="John Doe"
)
async def get_current_user(token: str = Depends(oauth2_scheme)):
user = fake_decode_token(token)
return user
@app.get("/users/me")
async def read_users_me(current_user: User = Depends(get_current_user)):
return current_user
獲取用戶
get_current_user 將使用我們創(chuàng)建的(偽)工具函數(shù),該函數(shù)接收 str 類型的令牌并返回我們的 Pydantic User 模型:
from typing import Optional
from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class User(BaseModel):
username: str
email: Optional[str] = None
full_name: Optional[str] = None
disabled: Optional[bool] = None
def fake_decode_token(token):
return User(
username=token + "fakedecoded", email="john@example.com", full_name="John Doe"
)
async def get_current_user(token: str = Depends(oauth2_scheme)):
user = fake_decode_token(token)
return user
@app.get("/users/me")
async def read_users_me(current_user: User = Depends(get_current_user)):
return current_user
注入當前用戶
因此現(xiàn)在我們可以在路徑操作中使用 get_current_user 作為 Depends 了:
from typing import Optional
from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class User(BaseModel):
username: str
email: Optional[str] = None
full_name: Optional[str] = None
disabled: Optional[bool] = None
def fake_decode_token(token):
return User(
username=token + "fakedecoded", email="john@example.com", full_name="John Doe"
)
async def get_current_user(token: str = Depends(oauth2_scheme)):
user = fake_decode_token(token)
return user
@app.get("/users/me")
async def read_users_me(current_user: User = Depends(get_current_user)):
return current_user
注意我們將 current_user 的類型聲明為 Pydantic 模型 User。
這將幫助我們在函數(shù)內部使用所有的代碼補全和類型檢查。
Tip
你可能還記得請求體也是使用 Pydantic 模型來聲明的。
在這里 FastAPI 不會搞混,因為你正在使用的是 Depends。
Check
這種依賴系統(tǒng)的設計方式使我們可以擁有不同的依賴項(不同的「可依賴類型」),并且它們都返回一個 User 模型。
我們并未被局限于只能有一個返回該類型數(shù)據(jù)的依賴項。
其他模型
現(xiàn)在你可以直接在路徑操作函數(shù)中獲取當前用戶,并使用 Depends 在依賴注入級別處理安全性機制。
你可以使用任何模型或數(shù)據(jù)來滿足安全性要求(在這個示例中,使用的是 Pydantic 模型 User)。
但是你并未被限制只能使用某些特定的數(shù)據(jù)模型,類或類型。
你想要在模型中使用 id 和 email 而不使用任何的 username?當然可以。你可以同樣地使用這些工具。
你只想要一個 str?或者僅僅一個 dict?還是直接一個數(shù)據(jù)庫模型類的實例?它們的工作方式都是一樣的。
實際上你沒有用戶登錄到你的應用程序,而是只擁有訪問令牌的機器人,程序或其他系統(tǒng)?再一次,它們的工作方式也是一樣的。
盡管去使用你的應用程序所需要的任何模型,任何類,任何數(shù)據(jù)庫。FastAPI 通過依賴項注入系統(tǒng)都幫你搞定。
代碼體積
這個示例似乎看起來很冗長??紤]到我們在同一文件中混合了安全性,數(shù)據(jù)模型工具函數(shù)和路徑操作等代碼。
但關鍵的是。
安全性和依賴項注入內容只需要編寫一次。
你可以根據(jù)需要使其變得很復雜。而且只需要在一個地方寫一次。但仍然具備所有的靈活性。
但是,你可以有無數(shù)個使用同一安全系統(tǒng)的端點(路徑操作)。
所有(或所需的任何部分)的端點,都可以利用對這些或你創(chuàng)建的其他依賴項進行復用所帶來的優(yōu)勢。
所有的這無數(shù)個路徑操作甚至可以小到只需 3 行代碼:
from typing import Optional
from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class User(BaseModel):
username: str
email: Optional[str] = None
full_name: Optional[str] = None
disabled: Optional[bool] = None
def fake_decode_token(token):
return User(
username=token + "fakedecoded", email="john@example.com", full_name="John Doe"
)
async def get_current_user(token: str = Depends(oauth2_scheme)):
user = fake_decode_token(token)
return user
@app.get("/users/me")
async def read_users_me(current_user: User = Depends(get_current_user)):
return current_user
總結
現(xiàn)在你可以直接在路徑操作函數(shù)中獲取當前用戶。
我們已經(jīng)進行到一半了。
我們只需要再為用戶/客戶端添加一個真正發(fā)送 username 和 password 的路徑操作。
這些內容在下一章節(jié)。
文章題目:創(chuàng)新互聯(lián)FastAPI教程:FastAPI教程 獲取當前用戶
URL標題:http://www.dlmjj.cn/article/coicoco.html


咨詢
建站咨詢
