일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Python
- dockerfile
- Container
- 코어 이더리움 프로그래밍
- docker
- rust
- 전문가를 위한 파이썬
- Network
- Refactoring
- 백준
- Algorithm
- Kubernetes
- AWS
- 블록체인
- guru
- Fast API
- 동시성
- fluent python
- 이더리움
- function
- 알고리즘
- Ethereum
- IMAGE
- BlockChain
- 파이썬
- RabbitMQ
- 러스트
- BAEKJOON
- Thread
- 플랫폼
Archives
- Today
- Total
글쓰기 | 방명록 | 관리 |
Victoree's Blog
[5] Dependency Injection이란? in Fast API 본문
728x90
1. 의존성 주입이란?
코드가 작동하고 사용하는데 필요한 종속성을 선언하는 방법이 있음
→ 종속성을 코드에 넣는데 필요한 모든 작업을 처리할 수 있음
- 공통의 코드(중복 코드) 존재 시
- 데이터베이스 연결
- 보안, 인증, 등등
[ 간단한 예시 ]
from fastapi import Depends, FastAPI
app = FastAPI()
async def common_parameters(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_parameters)):
return commons
@app.get("/users/")
async def read_users(commons: dict = Depends(common_parameters)):
return commons
class CommonQueryParams:
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: CommonQueryParams = Depends(CommonQueryParams)):
response = {}
if commons.q:
response.update({"q": commons.q})
items = fake_items_db[commons.skip : commons.skip + commons.limit]
response.update({"items": items})
return response
- 공통 파라미터의 경우, Depends
- Body, Query 와 같이 사용하지만, 약간 다르게 작동함
- Depends는 하나의 파라미터만 받을 수 있음
- 이 파라미터는 Callable한 오브젝트를 받을 수 있음(함수 or class object)
2. dependencies 설정하기 (global / operation)
from fastapi import Depends, FastAPI, Header, HTTPException
app = FastAPI()
# 다음과 같이 global dependencies를 주입할 수도 있음
# app = FastAPI(dependencies=[Depends(verify_token), Depends(verify_key)])
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 invalid")
return x_key
# path operation decorator에 의존성 리스트로 주입
@app.get("/items/", dependencies=[Depends(verify_token), Depends(verify_key)])
async def read_items():
return [{"item": "Foo"}, {"item": "Bar"}]
3. Router에 Dependency 설정하기
from fastapi import APIRouter, Depends, HTTPException
from ..dependencies import get_token_header
router = APIRouter(
prefix="/items",
tags=["items"],
dependencies=[Depends(get_token_header)],
responses={404: {"description": "Not found"}},
)
fake_items_db = {"plumbus": {"name": "Plumbus"}, "gun": {"name": "Portal Gun"}}
@router.get("/")
async def read_items():
return fake_items_db
@router.get("/{item_id}")
async def read_item(item_id: str):
if item_id not in fake_items_db:
raise HTTPException(status_code=404, detail="Item not found")
return {"name": fake_items_db[item_id]["name"], "item_id": item_id}
- internal / partner / admin 등 권한이 다른 api의 경우,
각각의 APIRouter에 dependencies를 설정함으로 각 authorization을 validation 할 수 있음
728x90
'Python > Fast API' 카테고리의 다른 글
[6] Middleware, Background Tasks, Sub Application in Fast API (0) | 2021.07.30 |
---|---|
[4] Pydantic Model (0) | 2021.07.22 |
[3] Fast API Basic - Response 편 (0) | 2021.07.20 |
[2] Fast API Basic - Request 편 (2) | 2021.07.20 |
[1] Fast API로 한걸음! (0) | 2021.07.19 |
Comments