Coding 공부/Big data & Python

[Big data & Python] FastAPI, Path Parameters, query(get), post(Request Body), Pydantic, Annotated

CBJH 2024. 4. 15.
728x90
반응형

1. FastAPI - 01 (FastAPI란?)

이론 링크: https://just-record.github.io/fastapi/fastapi-01/

 

from fastapi import FastAPI

app = FastAPI() # FastAPI의 인스턴스 객체 app를 생성. 


@app.get("/")       # 경로 동작 데코레이터 (url 주소)
async def root():   # 경로 동작 함수
    return {"message": "Hello World"} # json Type으로 return
  • 저번 시간에 사용했던 Flask랑 사용법이 비슷하다.(같은 웹 호스팅 모듈이라 그런 것 같다)
  • cmd창에 curl -X GET \  http://localhost:8000/ 를 입력하면 호스팅한 값을 콘솔창에 띄운다.
  • Path Parameters의 데이터 타입을 지정 할 수 있어 try-catch문으로 백엔드에서 데이터 타입을 따로 확인할 필요가 없어 편리하다.

 

1.1 서버 실행

  • 명령 프롬프트 창에 'uvicorn main:app --reload' 를 입력한다.
uvicorn main:app --reload
  • 입력하는 경로안에 main.py가 있어야한다. 만약에 경로에 없다면 명령 프롬프트 창에서 cd명령어로 파이썬 파일이 들어있는 디렉토리로 경로를 변경해주자.
  • main은 파이썬 파일명으로 다른 이름으로 변경해도 되지만 띄어쓰기는 인식하지 못한다.
  • 기본적으로 개발자는 파일명에 띄어쓰기는 사용하지 않고 언더바를 사용하는 것이 기본이다. (데이터 베이스는 대소문자를 구분하지 않으므로 낙타 표기법도 좋지 않다. 왠만하면 언더바를 사용한 표기법에 익숙해지자)
  • app은 파이썬 파일 내에서 app 인스턴스를 FASTAPI의 객체로 생성했기 때문에 사용한 것으로, 다른 명칭으로 변경할 수 있다.

1.2 웹호스팅 주소

웹 브라우저의 주소창에 'http://127.0.0.1:8000'를 입력하면 FASTAPI의 app객체로 생성한 경로 동작함수 반환값이 보인다.

 

 

1.3 return 방식

FastAPI는 기본적으로 application/json 형태로 응답을 처리한다. 따라서 return을 하면 웹페이지에서 제이슨 형태가 텍스트로 출력된다.

HTML 콘텐츠를 올바르게 반환하려면 응답의 Content-Typetext/html로 명시적으로 설정해야 한다. import를 해주면 FastAPI의 HTMLResponse를 사용할 수 있습니다.

 

from fastapi import FastAPI
from fastapi.responses import HTMLResponse

app = FastAPI()

@app.get("/", response_class=HTMLResponse)  # HTMLResponse로 응답 클래스를 지정
async def read_root():
    # HTML 코드를 문자열로 반환
    html_content = """
    <html>
    <head>
        <title>Example Page</title>
        <style>
            h1 { color: red; }
            p { color: blue; }
        </style>
    </head>
    <body>
        <h1>Hello, FastAPI!</h1>
        <p>This is a simple HTML response with CSS.</p>
    </body>
    </html>
    """
    return HTMLResponse(content=html_content)
  • 조금 번거롭긴 하지만 java의 servlet보단 편하다.

  • css와 Html 태그가 잘 적용된 것을 볼 수 있다.

 

1.4 서버 종료

  • FastAPI서버를 종료하고 싶다면 uvicorn 명령어를 입력했던 명령 프롬프트 창에서 'Ctrl + c'키를 누르면 된다.
Ctrl + c

 

 

 

1.5 FastAPI의 강력한 대화형 문서

  • 웹 브라우저 주소에 'http://127.0.0.1:8000/docs'를 입력하면 대화형 문서창이 나온다.
http://127.0.0.1:8000/docs

 

  • Postman 어플리케이션 없이 post를 보내거나 변수를 입력하는 등 다양한 테스트를 할 수 있는 편의 기능을 제공한다.

 

2. FastAPI - Path Parameters

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_item(item_id: int):  # item_id는 int Type으로 변경 됨
    return {"item_id": item_id}

Flask와 같이 중괄호로 Path Parameter를 사용할 수 있다.

콜론을 사용해 데이터 타입을 지정 할 수 있다. docs로 확인가능하고 다른 데이터 타입이 입력된다면 에러를 브라우저에 반환하므로 쉽게 잘못된 부분을 체크할 수 있다.(코드의 유지보수가 수훨하다)

 

 

3. FastAPI - Query 매개변수

  • 매개변수가 URL의 쿼리 스트링으로 처리된다.
  • URL에서 ‘?’ 뒤에 오는 부분은 ‘key=value’ 형식으로 구성된 쿼리 매개변수를 나타낸다.
  • 각 쿼리 매개변수는 ‘&’로 구분된다.
http://127.0.0.1:8000/items/?skip=0&limit=10
  • skip은 값이 0으로, limit는 값이 10으로 설정된 쿼리 매개변수가 된다.

 

from fastapi import FastAPI

app = FastAPI()

@app.get("/")     # 경로 매개변수가 없음
async def read_item(x1: int = 0, x2: int = 10): 
    return x1 + x2

 

http://127.0.0.1:8000/?x1=11&x2=22

이렇게 입력하면 x1값이 11으로, x2값이 22로 매개변수가 되어 return값 33이 웹 브라우저에 출력된다.

 

 

4. FastAPI - 04 (Request Body)

POST 요청은 데이터를 HTTP의 Request Body(요청의 본문)을 통해 전송한다. 3번의 Query 매개변수와 다른 방식의 전송 방법이다.

 

app = FastAPI()

x = 'Hello, world!'
@app.post("/")    # POST 메소드
async def create_item(x):  # 경로, 쿼리 매개변수와 같은 패턴
    return x

 

  • 브라우저에 Hello, wolrd!가 출력될 것 같지만 아니다.
  • post방식은 HTML의 form 형식에서 submit으로 value값을 보내거나 Postman 어플로 post값을 보내거나, docs에서 값을 Execute하는 방법으로 보낼 수 있다.
  • 따라서 이런 방식으로 return하는 것은 의미가 없고, 파이썬의 pydantic -Basemodel로 데이터 타입을 지정한 뒤, 해당 데이터를 post형식으로 받는데 사용한다.
  • Pydantic으로 생성한 데이터는 클래스이므로 필드값이 key, value로 매칭되어 jason타입으로 반환 받을 수 있다.

 

5. Pydantic

  • 이론 링크: https://just-record.github.io/python/python-pydantic/
  • pydantic은 Python의 Type Annotations을 활용하여 데이터 유효성을 검사 하는 라이브러리입니다.
  • 강제성은 없지만 데이터 타입을 명시하여 가독성을 높히고 오류를 미연에 방지할 수 있다.
# pydantic의 BaseModel을 상속하여 데이터 모델을 정의
from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    email: str
    is_active: bool = True

 

 

6. FastAPI - 05 (쿼리 매개변수와 문자열 유효성 검사)

 

  • Annotated를 사용하여 쿼리 매개변수의 유효성 검사를 할 수 있습니다.
  • Annotated는 어떤 데이터 데이터 타입을 매개변수로 받을지 지정하는데 사용된다.
  • Query() 매개 변수로 데이터 타입 뿐만아니라 범위를 지정할 수 있다.
from typing import Union

from fastapi import FastAPI, Query      # Query import
from typing_extensions import Annotated # Annotated import
# python 3.10
# from typing import Annotated

app = FastAPI()


@app.get("/items/")
# Query(max_length=50) - 쿼리 매개변수의 최대 길이를 50으로 지정
# Union[str, None]와 Query(max_length=50)을 Annotated로 묶음
# 기본값을 None으로 지정
async def read_items(q: Annotated[Union[str, None], Query(max_length=50)] = None):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

 

 

댓글