Fastapi document를 보고 메모하는 블로그입니다.
fastapi document : https://fastapi.tiangolo.com/
- my_awesome_api=FastAPI() in main.py -> uvicorn main:my_awesome_api --reload --host 0.0.0.0
- --host는 접근할 수 있는 host를 지정해주는 것이고, --reload는 서버가 떠있는 상황에서 코드변화가 일어나면 자동으로 reload해주는 것이다.
- PATH는 ENDPOINT 혹은 ROUTER라고 한다.
- get, post, put, delete 뿐만 아니라 options, head, patch, trace도 있다. (ex: @app.options())
- async def 대신에 def를 써도 되는데 그 이유는 async를 지정하지 않아도, fastapi 내부적으로 쓰레드풀이 있기 때문에 async하게 작동한다.
Path Parameters
@app.get("/users/me")
async def read_user_me():
return {"user_id": "the current user"}
@app.get("/users/{user_id}")
async def read_user(user_id: str):
return {"user_id": user_id}
- users/me를 먼저 선언해야한다. 이유는 만약 {user_id}를 먼저 선언하면 me로 받을 수 있기 때문에.
@app.get("/users")
async def read_users():
return ["Rick", "Morty"]
@app.get("/users")
async def read_users2():
return ["Bean", "Elfo"]
- 무조건 첫번째 path로만 들어온다.
@app.get("/users/{user_name}")
async def call_user(user_name: UserDto = Depends(UserDto)):
return {"user": user_name}
- path parameter를 특정 class로 depends하거나, 쓰이지 않을 경우에는 path_parameter 값은 필요가 없으므로, 아무 값이나 넣거나, swagger에서도 값을 받지 않는다.
class ModelName(str, Enum):
alexnet = "alexnet"
resnet = "resnet"
lenet = "lenet"
app = FastAPI()
@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
if model_name == ModelName.alexnet:
return {"model_name": model_name, "message": "Deep Learning FTW!"}
if model_name.value == "lenet":
return {"model_name": model_name, "message": "LeCNN all the images"}
return {"model_name": model_name, "message": "Have some residuals"}
- str은 변수형을 설정(안해도된다). Enum은 ModelName['alexnet'](="alexnet"), ModelName.alexnet(="alexnet"), ModelName.alexnet.name(=alexnet), ModelName.alexnet.value(="alexnet")으로 사용 가능.
- 만약 path parameter인 model_name에 enum을 제외한 값이 들어가면 422(Error: Unprocessable Entity)에러가 뜬다.
@app.get("/files/{file_path:path}")
async def read_file(file_path: str):
return {"file_path": file_path}
- path parameter값이 /abc/def 처럼 /(슬래쉬)가 들어간 경우에는 위처럼 :path가 없으면 경로로 인식하여 404 not found 에러가 뜬다.
- 따라서 저렇게 :path로 명시해주면 /(슬래쉬)가 들어가도 인식한다.
Query Parameters
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Optional[str] = None, short: bool = False):
if q:
return {"item_id": item_id, "q": q}
if not short:
item.update(
{"description": "This is an amazing item that has a long description"}
)
return {"item_id": item_id}
- item_id = path parameter, q = query paramete -> q는 Optional이기 때문에 쿼리로 넣어줘 도되고 안해도된다.
- (q: Optional[str] = None) == python 3.6이상 (q: Union[str, None] = None) == python 3.10 이상 (q: str | None = None)
Request Body
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item
- pydantic의 BaseModel을 통해 enum 효과+다양한 자료형 -> request body에 Item 변수들이 포함되어야한다.
- parameter가 path에 선언되었다면 path parameter로 인식된다.
- parameter가 singular type이라면 (int, float, str, bool, ...) query parameter로 인식된다.
- parameter가 pydantic type으로 선언되었다면, request body로 인식된다.
- 다음과 같이 pydantic model은 여러가지 내부 함수를 제공해준다.
'Fastapi' 카테고리의 다른 글
내맘대로 Fastapi Document summary[6] (0) | 2021.11.22 |
---|---|
내맘대로 Fastapi Document summary[5] (0) | 2021.11.20 |
내맘대로 Fastapi Document summary[4] (0) | 2021.11.20 |
내맘대로 Fastapi Document summary[3] (0) | 2021.11.20 |
내맘대로 Fastapi docs 정리(Response Model, Extra Model) (0) | 2021.11.19 |