
如何快速實現(xiàn)REST API集成以優(yōu)化業(yè)務流程
這段代碼做了啥呢?首先我們導入了FastAPI
類,接著創(chuàng)建了一個app
實例。然后通過裝飾器@app.get("/")
定義了一個GET請求的路由,當訪問根路徑時就會調用read_root
函數(shù),返回一個字典,里面包含了我們的問候語。
要啟動這個API,回到命令行,運行uvicorn main:app --reload
。--reload
參數(shù)可以讓Uvicorn在代碼變化時自動重啟服務器,方便調試。
FastAPI天生支持異步編程,這可是個大殺器。異步函數(shù)可以同時處理多個任務,不會因為等待某個操作完成而阻塞整個程序。修改剛才的read_root
函數(shù),加上async
關鍵字試試看。
@app.get("/")
async def read_root():
return {"message": "Hello, async world!"}'
現(xiàn)在這個函數(shù)變成了異步的,雖然看起來沒多大區(qū)別,但在處理I/O密集型任務(比如數(shù)據(jù)庫查詢、網絡請求)時,它的性能提升可就不是一點兩點了。
有時候你想讓API更靈活一些,比如根據(jù)不同的用戶ID返回特定的信息。這時候就可以用到路徑參數(shù)了。看看下面的例子:
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
這里{item_id}
就是路徑參數(shù),它會自動轉換成整數(shù)類型。這樣你就可以通過/items/1
這樣的URL來獲取特定項的信息了。
溫馨提示:記得檢查路徑參數(shù)的數(shù)據(jù)類型哦,要是傳入了不符合要求的值,FastAPI會幫你自動返回422錯誤,不過最好還是自己提前做好驗證。
除了路徑參數(shù),你還可能需要根據(jù)用戶的額外需求來調整返回的內容。查詢參數(shù)就能派上用場了。來看個例子:
from typing import Union
@app.get("/items/")
async def read_item(q: Union[str, None] = None):
if q:
return {"q": q}
return {"message": "No query parameter"}
q
就是一個查詢參數(shù),如果用戶在請求中提供了?q=something
,那么q
就會有值;如果沒有提供,q
就會是None
。為了不讓代碼出錯,我們給q
設了個默認值None
,并使用了typing.Union
來告訴FastAPI這個參數(shù)可能是字符串也可能是None
。
當你要接收用戶提交的數(shù)據(jù)時,就需要用到請求體了。FastAPI結合Pydantic庫,可以輕松地定義數(shù)據(jù)模型,并自動進行數(shù)據(jù)校驗。舉個栗子:
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Union[str, None] = None
price: float
tax: Union[float, None] = None
@app.post("/items/")
async def create_item(item: Item):
return item
Item
類定義了請求體的結構,每個字段都指定了類型,還可以設置默認值。當你POST一個JSON對象到/items/
時,F(xiàn)astAPI會自動解析并驗證數(shù)據(jù),只有符合模型定義的數(shù)據(jù)才會被接受。
說到這兒,不得不提一下FastAPI最酷炫的功能之一——自動化交互文檔。只要你按照規(guī)范定義了API,FastAPI就會自動生成Swagger UI或ReDoc界面。這些界面上不僅可以查看API文檔,還能直接測試API功能,簡直不要太方便。
訪問http://127.0.0.1:8000/docs
或者http://127.0.0.1:8000/redoc
就能看到它們了。是不是超省心?
構建API的時候,安全性絕對不能忽視。FastAPI提供了多種方式來保護你的API,比如OAuth2認證、依賴注入等。你可以根據(jù)實際需求選擇合適的安全措施。比如說,想要限制某些敏感接口只能由授權用戶訪問,就可以用Depends
來添加認證邏輯。
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
async def get_current_user(token: str = Depends(oauth2_scheme)):
# 這兒寫你的認證邏輯
fake_user_db = {"johndoe": "secret"}
user = fake_user_db.get(token)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid authentication credentials",
headers={"WWW-Authenticate": "Bearer"},
)
return user
@app.get("/users/me")
async def read_users_me(current_user: str = Depends(get_current_user)):
return {"user": current_user}
這段代碼展示了如何用OAuth2PasswordBearer
來獲取用戶提供的Token,并通過Depends
將其傳遞給認證函數(shù)。如果認證失敗,就會拋出異常,阻止未授權的訪問。
以下是使用FastAPI時的一些最佳實踐方式,確保你在構建應用時能夠遵循fastapi 最佳實踐:
今天咱聊了這么多關于FastAPI的東西,從安裝到創(chuàng)建API,再到異步函數(shù)、路徑參數(shù)、查詢參數(shù)、請求體、自動化文檔和安全性。你會發(fā)現(xiàn),用FastAPI構建API真的挺簡單,而且效率極高。希望這些內容能幫助你更好地理解和使用FastAPI,快去動手試試吧!
文章轉自微信公眾號@彩虹的生財日常