Web 9 : Fastapi

haeIT·2024년 8월 14일

Web

목록 보기
9/14
post-thumbnail
  • 오늘부터 fast api 하면서 백, 프론트 같이 구현하는 쪽으로 수업 방향
  • flask 보다 최근에 나온게 fast api, 더 최신 트렌드
  • 그래도 아직 flask를 더 많이 쓰긴 함
  • flask, fast api 비슷함
  • 취업할 땐 장고 多사용하는게 좋음(완벽 풀스택 파이썬 지원)
  • 웹은 자바가 우세

설치, ch0

  1. pip install fastapi

  2. 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

🤔 q값에 아무것도 전달 안하면??

  • 빈리스트만 전달 된다.

ch2

👉 client : 서버에 요청을 하는 주체

👉 server : 클라이언트의 요청을 받고 요청에 맞는 데이터를 리턴하는 주체

👉 http 메서드

  • client가 server에게 요청을 하는 메소드
  1. get : 서버로 요청 시 전송값을 url에 경로매개변수, 쿼리매개변수 방식으로 전달
  2. post : 서버에 요청 시 별도의 json형식으로 암호화해서 전달하는 방식
  3. put : 서버에 값의 변경을 요청하는 경우
  4. delete : 서버에 값의 삭제를 요청하는 경우
  5. patch : 데이터를 수정
  6. options : 허용되는 메서드 확인
  7. head : 헤더 정보만 요청
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....'}

  • 아래 확장프로그램 참고

- 크롬 확장프로그램 talend 설치


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)를 리턴

  • get 방식 사용
  • 근데 왜 fido가 나오지

  • 왜인진 모르겠지만 animal을 val로 고치니까 됨
    왤까???

  • 아~! 라우터 주소 이름이랑 충돌해서 그런듯?!

  • 1~2일이면 fast api 진도 끝


ch5 - response class

Response Class

  • http가 응답하는 종류를 정의하는 클래스
  • 반환되는 데이터 형식을 제어
  1. JSONResponse : JSON 형식의 데이터 반환 용도

  2. HTMLResponse : HTML 형식의 데이터 반환 용도

  3. PlainTextResponse : 단순 텍스트 형식의 응답 반환 용도

  4. 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')

  • redirect 치면 text로 넘어감

Response class 장점

  1. 자동 타입 추론: fastapi return type을 추론할 필요가 없다. -> 성능개선
  2. 코드 가독성을 높인다
  3. 리턴타입을 명시적으로 확정할 수 있다.

  • 웹 앱 구현시 가장 여려운 부분은 데이터베이스
  • 쿼리를 이용해서 db 작동시킴
  • fastapi 는 query 몰라도 ㄱㅊ

0개의 댓글