[Back-End] FastAPI

HipJaengYiCat·2023년 7월 6일
0

FastAPI 특징

  • High Performance : Node.js, go와 대등한 성능

  • Easy : Flask와 비슷한 구조, Microservice에 적합

  • Productivity : Swagger 자동 생성, Pydantic을 이용한 Serialization

  • 장점

  • Flask보다 간결한 Router 문법
  • Asynchronous(비동기) 지원
  • Built-in API Documentation (Swagger)
  • 단점
  • 아직 Flask 유저가 더 많음

  • ORM 등 Database와 관련된 라이브러리가 적음

  • FastAPI 프로젝트시 필요한 패키지

  • pip install fastapi [https://pypi.org/project/fastapi/]
  • pip install uvicorn [https://pypi.org/project/uvicorn/]
  • pip install gunicorn [https://pypi.org/project/gunicorn/]

Fast API를 이용한 프로젝트 구조

  • app : 프로젝트의 코드가 들어갈 모듈 설정(app), 'app'대신 프로젝트 이름, src 등 사용할 수 있음
  • main.py : 간단하게 애플리케이션을 실행할 수 있는 Entrypoint 역할
    [https://docs.python.org/3/library/main.html]
    * Entrypoint : 프로그래밍 언어에서 최상위 코드가 실행되는 시작점 또는 프로그램 진입점
  • main.py(or app.py) : FastAPI의 애플리케이션과 Router 설정
  • model.py : ML model에 대한 클래스와 함수 정의

Poetry로 파이썬 패키지 관리하기

FastAPI 기본지식

Path Parameter

  • 웹에서 GET Method를 사용해 데이터를 전송할 때 서버에 원하는 값을 전달하고 변수로 사용
    ex) ID 402인 사용자 정보를 가져올 경우 : .../users/402

Query Parameter

  • 웹에서 GET Method를 사용해 데이터를 전송할 때 key, valud로 전달함
  • Query String
  • API 뒤에 입력 데이터를 함께 제공하는 방식으로 사용
  • Query String은 Key, Value의 쌍으로 이루어지며 &로 연결해 여러 데이터를 넘길 수 있음
    ex) ID 402인 사용자 정보를 가져올 경우 : .../users?id=402
    ex) 네이버에서 검색할 경우 : https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=광진구

Path Parameter VS Query Parameter

어떤 Resource를 식별하고 싶은 경우(그러나 kyle이란 유저는 없는 경우)

  • /users/kyle : Path -> 저 경로에 존재하는 내용이 없으면 404 error

  • /users?name=kyle : Query -> 데이터가 없는 경우 빈리스트 -> Error Handling 필요함

  • Resource를 식별해야 하는 경우 : Path Parameter가 더 적합

  • 정렬, 필터링을 해야 하는 경우 : Query Parameter가 더 적합

Request Body

  • 클라이언트에서 API에 데이터를 보낼 때, Request Body를 사용함
  • 클라이언트 => API : Request Body
  • API의 Response => 클라이언트 : Response Body
  • Request Body에 데이터를 보내고 싶다면 POST Method를 사용, 데이터가 항상 포함되어야하는 것은 아님
    (참고) GET Method는 URL, Request Header로 데이터 전달
  • Body의 데이터를 설명하는 Content-Type이란 Header 필드가 존재하고, 어떤 데이터 타입인지 명시해야 함
    - application/x-www-form-urlencoded : BODY에 Key, Value 사용. & 구분자 사용
    - text/plain : 단순 txt 파일
    - multipartform-data : 데이터를 바이너리 데이터로 전송

    Form

    • Form(입력) 형태로 데이터를 받고 싶은 경우
    • Form을 사용하려면 python-multipart를 설치해야 함

      pip install python-multipart
      pip install Jinja2 # 프론트도 간단히 만들기 위해 Jinja2 설치

Pydantic

  • Data Validation / Settings Management 라이브러리
  • Type Hint를 런타임에서 강제해 안전하게 데이터 핸들링
  • 파이썬 기본 타입(String, Int 등) + List, Dict, Tuple에 대한 Validation 지원
  • 기존 Validation 라이브러리보다 빠름
    Benchmark : https://site-deploy--pydantic-docs.netlify.app/benchmarks/
  • Config를 효과적으로 관리하도록 도와줌
  • 머신러닝 Feature Data Validation으로도 활용 가능

Validation

  • Machine Learning Model Input Validation
  • Online Serving에서 Input 데이터를 Validation하는 Case

Validation Check Logic

  • 조건 1: 올바른 url을 입력 받음 (url)
  • 조건 2: 1-10 사이의 정수 입력 받음 (rate)
  • 조건 3: 올바른 폴더 이름을 입력 받음(target_dir)

사용할 수 있는 방법

  • 1) 일반 Python Class를 활용한 Input Definition 및 Validation
    -> 의미 없는 코드 많아짐

  • 2) Dataclass를(python 3.7 이상 필요) 활용한 Input Definition 및 Validation
    -> 인스턴스 생성 시점에서 Validation을 수행하기 쉬움
    -> 여전히 Validation 로직들을 직접 작성해야 함
    -> Validation 로직을 따로 작성하지 않으면, 런타임에서 type checking을 지원하지 않음


  • 3) Pydantic을 활용한 Input Definition 및 Validation
    -> 훨씬 간결해진 코드 (6라인)(vs 52라인 Python Class, vs 50라인 dataclass)
    -> 주로 쓰이는 타입들(http url, db url, enum 등)에 대한 Validation이 만들어져 있음 - 런타임에서 Type Hint에 따라서 Validation Error 발생
    -> Custom Type에 대한 Validation도 쉽게 사용 가능

  • 어디서 에러가 발생했는지
  • location, type, message 등을 알려줌

Pydantic Config

  • Pydantic은 Config을 체계적으로 관리할 방법을 제공

  • 기존에 다른 라이브러리들은 어떻게 Config를 설정하고 있을까?

  • Twelve-Factor
    설정을 코드에서 엄격하게 분리하는 것을 요구함
    설정을 환경 변수(envvars나 env라고도 불림)에 저장함
    환경 변수는 코드 변경 없이 쉽게 배포 때마다 쉽게 변경할 수 있음
    SaaS(Software as a Service)를 만들기 위한 방법론을 정리한 규칙들에 따르면, 환경 설정은 애플리케이션 코드에서 분리되어 관리되어야 함
    https://12factor.net/ko/config

1) .ini, .yaml 파일 등으로 config 설정하기

2) flask-style config.py

  • Config 클래스에서 yaml, ini 파일을 불러와 python class 필드로 주입하는 과정을 구현
  • Config를 상속한 클래스에서는 Config 클래스의 정보를 오버라이딩해서 사용
  • 하지만 해당 파일의 데이터가 정상적인지 체크하거나(Validation) 또는 환경 변수로 부터 해당 필드를 오버라이딩(Overriding) 하려면 코드량이 늘어남

3) pydantic base settings

  • Validation처럼 Pydantic은 BaseSettings를 상속한 클래스에서 Type Hint로 주입된 설정 데이터를 검증할 수 있음
  • Field 클래스의 env 인자로, 환경 변수로 부터 해당 필드를 오버라이딩 할 수 있음
  • yaml, ini 파일들을 추가적으로 만들지 않고, .env 파일들을 환경별로 만들어 두거나, 실행 환경에서 유연하게 오버라이딩 할 수 있음
  • environment variable overriding
profile
AI Learning, Parcelled Innovations, Carrying All

0개의 댓글