FastAPI 依赖注入
什么是依赖注入?, Depends
声明代码(本文中为路径操作函数 )运行所需的,或要使用的「依赖」的一种方式。
依赖注入常用于以下场景:
共享业务逻辑(复用相同的代码逻辑)
共享数据库连接
实现安全、验证、角色权限
等……
使用依赖注入,将代码重复最小化。
示例一
# coding: utf8
from fastapi import FastAPI, Depends
from typing import Optional
app = FastAPI()
# 依赖,类似公共组件
async def common_args(
q: Optional[str] = None,
skip: int = 0,
limit: int = 100
):
return {"q": q, "skip": skip, "limit": limit}
@app.get('/items/')
async def get_items(commons: dict = Depends(common_args)):
return commons
@app.get('/users/')
async def get_users(commons: dict = Depends(common_args)):
return commons
# # 启动: uvicorn main:app --reload
示例二
from fastapi import Depends, FastAPI
app = FastAPI()
fake_items_db = [{"city": "beijing"}, {"city": "shanghai"},
{"city": "heze"}]
class CommonQueryParams:
def __init__(self, desc: str , skip: int = 0, limit: int = 100):
self.desc = desc
self.skip = skip
self.limit = limit
@app.get("/items/")
def read_items(commons: CommonQueryParams = Depends()):
response = {}
if commons.desc:
response.update({"desc": commons.desc})
items = fake_items_db[commons.skip : commons.skip + commons.limit]
response.update({"items": items})
return response
嵌套依赖
from fastapi import Depends, FastAPI
from typing import Optional
app = FastAPI()
fake_items_db = [{"city": "beijing"}, {"city": "shanghai"},
{"city": "heze"}]
def query_extractor(desc: Optional[str] = None):
return desc
def query__extractor(
desc: str = Depends(query_extractor),
name: Optional[str]="" ,
):
if not desc:
return name
return desc
@app.get("/items/")
def read_items(query__extractor: str = Depends(query__extractor)):
return query__extractor
路径操作装饰器依赖项
X-Token 存在且必须等于 token123,
Host 存在且必须等于 google.com
# coding: utf8
from fastapi import FastAPI, Depends, Header, HTTPException,status
from typing import Optional
app = FastAPI()
def verify_token(token: str= Header(..., alias="X-Token")):
if token != 'token123':
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail='Token header invalid')
def verify_host(host: str = Header(..., alias='Host')):
if host != 'google.com':
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail='Host header invalid')
@app.get("/items", dependencies=[Depends(verify_token), Depends(verify_host)])
async def read_items():
return {"code": status.HTTP_200_OK}
# # 启动: uvicorn main:app --reload
全局依赖
比如我们全局都需要校验token
# coding: utf8
from fastapi import FastAPI, Depends, Header, HTTPException, status
def verify_token(token: str= Header(..., alias="X-Token")):
if token != 'token123':
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail='Token header invalid')
app = FastAPI(dependencies=Depends(verify_token))
@app.get("/items")
async def read_items():
return {"code": status.HTTP_200_OK}
# # 启动: uvicorn main:app --reload
FastAPI 兼容性
依赖注入系统如此简洁的特性,让 FastAPI 可以与下列系统兼容:
NoSQL 数据库
外部支持库
外部 API
认证和鉴权系统
API 使用监控系统
响应数据注入系统
Last updated