설치, ch0
pip install fastapi

pip install uvicorn

기본 문법
from fastapi import FastAPI
app = FastAPI()
@app.get('/')
def read_root():
return {'message':'Hello, World!'}
터미널창에서 uvicorn main:app --reload 실행하는데 오류나서
터미널 새로켬
그래도 안됨
cd C:\Users\M\Fastapi\ch0 하위 디렉토리로 이동
dir : 해서 확인



#경로 파라미터
@app.get('/items/{item_id}')
def read_item(item_id):
return {'item_id':item_id} #경로 파라미터를 받아서 반환
#쿼리 매개변수
@app.get('/items')
def read_items(skip, limit):
return {'skip':skip, 'limit':limit}

ch1
from fastapi import FastAPI
app = FastAPI()
@app.get('/items/{item_id}')
def read_item(item_id:int): #type hint
return {'item_id':item_id}
@app.get('/getdata/')
def read_items(data:str = 'fastapi type hint'): #쿼리매개변수의 type은 str, 매개변수값이 입력되지 않으면 기본값을 사용하겠다는 뜻
return {'data':data}
#고급 타입 힌트 방식
from fastapi import FastAPI, Query
from typing import List, Dict
@app.get('/items1/')
async def read_items(q: List[int] = Query([])): #비동기함수 -> 뒤에서 계속
return {"q":q}
@app.post('/create-item/')
async def create_item(item: Dict[str, int]): #딕셔너리 타입 힌트
return item


ch2
from fastapi import FastAPI
app = FastAPI()
#파라미터 없이 get 요청
@app.get('/')
def read_root():
return {'message':'Hello, World!'}
#경로파라미터를 통해서 get 요청
@app.get('/items/{item_id}')
def read_item(item_id:int):
return {'item_id':item_id}
#쿼리파라미터를 통해서 요청
@app.get('/items1')
def read_item1(item_id : int):
return {'item_id':item_id}
#쿼리파라미터를 통해서 요청
@app.get('/items2')
def read_item1(skip: int = 0, limit : int=10): #기본값이 설정되면 매개변수 입력이 필수가 아님
return {'skip': skip, 'limit':limit}
#post요청을 받는 경우
@app.post('/items/')
def create_item(item:dict):
return {'item':item}
#put요청을 받는 경우(post로 전부 처리 가능해서 잘 사용하지는 않음)
@app.put('/items/{item_id}')
def update_item(item_id:int, item:dict):
return {'item_id':item_id,'updated_item':item}
#delete 삭제 요청
@app.delete('/items/{item_id}')
def delete_item(item_id:int):
return{'message':f'Item {item_id} deleted....'}



pydantic ch4
'''
- response 형식을 지정
- response_model의 장점
1. 데이터 검증: 리턴값에 대해 지정된 형식에 맞는지 유효성 검증을 자동으로 수행
2. 자동 문서화: FastAPI는 response_model을 사용하여 자동으로 API 문서를 생성
3. 보안강화 : 노출되지 않아야 할 정보를 숨길 수 있다.
'''
from fastapi import FastAPI
from pydantic import BaseModel, Field
from typing import Optional, List, Union
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello Haein"}
class Item(BaseModel):
name:str
description: str = None
price: float
def get_item_from_db(id):
return {
"name" : "simple item",
"description" : "simple item description",
"price" : 5,
"dis_price" : 45.0
}
@app.get("/items/{item_id}", response_model=Item) # return값의 형식을 지정
def read_item(item_id:int):
item = get_item_from_db(item_id)
return item
#Union 응답모델
class Cat(BaseModel):
name: str
class Dog(BaseModel):
name: str
@app.get('/animal/', response_model = Union[Cat, Dog])
async def get_animal(animal:str):
if animal == 'cat':
return Cat(name='whiskers') #Cat pydanic class의 객체(dict)를 리턴
else:
return Dog(name='fido') #Dog pydanic class의 객체(dict)를 리턴


왜인진 모르겠지만 animal을 val로 고치니까 됨
왤까???
아~! 라우터 주소 이름이랑 충돌해서 그런듯?!
1~2일이면 fast api 진도 끝
ch5 - response class
JSONResponse : JSON 형식의 데이터 반환 용도
HTMLResponse : HTML 형식의 데이터 반환 용도
PlainTextResponse : 단순 텍스트 형식의 응답 반환 용도
RedirectResponse : 클라이언트를 다른 URL로 리다이렉트
from fastapi import FastAPI
from fastapi.responses import JSONResponse, HTMLResponse, PlainTextResponse, RedirectResponse
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello Haein"}
@app.get('/json', response_class=JSONResponse) # response_class 반환되는 데이터 형식을 지정
def read_json():
return {'msg': 'this is Json'}
@app.get('/html', response_class=HTMLResponse)
def read_html():
return '<h1>This is HTML</h1>'
@app.get('/text', response_class=PlainTextResponse)
def read_text():
return 'This is Plain Text'
@app.get('/redirect')
def read_redirect():
return RedirectResponse(url='/text')



