종속성 주입
라우트 함수 인자에 Depends 키워드를 사용하여 종속성을 해결할 수 있다.
종속성은 함수(또는 클래스)에서 하위 종속성을 중첩해서 사용할 수도 있다.
1. 함수로 종속성 사용하기
[code]
async def common_params(q: Optional[str] = None, skip:int = 0, limit: int = 100):
return { “q”: q, “skip”: skip, “limit”: limit }
@app.get(“/items/”)
async def read_items(commons: dict = Depends(common_params)):
return commons
[/code]
2. 클래스로 종속성 사용하기
[code]
class CommonParams:
def __init__(self, q: Optional[str] = None, skip:int = 0, limit:int = 100):
self.q = q
self.skip = skip
self.limit = limit
@app.get(“/items/”)
async def read_items(commons: CommonParams = Depends(CommonParams)):
return commons
[/code]
3. 경로 데코레이터에 의존성주입
: 일반 종속성과 다른점은 반환값이 함수에 전달되지 않는다는 점이다
[code]
from fastapi import Depends, FastAPI, Header, HTTPException
app = FastAPI()
async def verify_token(x_token: str = Header(…)):
if x_token != “fake-super-secret-token”:
raise HTTPException(status_code=400, detail=”X-Token header invalid”)
async def verify_key(x_key: str = Header(…)):
if x_key != “fake-super-secret-key”:
raise HTTPException(status_code=400, detail=”X-Key header invliad”)
return x_key # 전달되지 않는다
@app.get(“/items/”, dependencies=[Depends(verify_token), Depends(verify_key))
async def read_items():
return [{“item”: “Foo”}, {“item”: “Bar”}]
[/code]
4. 전역종속성
: FastAPI 인스턴스 생성시 넣어주면 된다.
[code]
app = FastAPI(dependencies = [Depends(verify_token), Depends(verify_key)]
[/code]
5. yield 를 사용한 종속성
: 특히 Database 에서는 사용후 반드시 닫아줘야 하는 과정이 있는데 이때 사용하면 좋다.
[code]
async def get_db():
db = DBSession()
try:
yield db
finally:
db.close() # 응답이 완료된 후 자동으로 닫아준다
[/code]