FastAPI

주제무·2023년 3월 24일
0

web project

목록 보기
1/2

FastAPI

pydantic, starlette

key features

  • python web backend framework
  • easy to learn
  • fast
  • OpenAPI 3.0 and JSON Schemas

Pydantic

python data library

this part is from
https://docs.pydantic.dev/

타입힌트를 통해서 데이터 형식을 검사해주는 라이브러리, parsing까지 지원

Pydantic

  • 데이터 타입이 맞지 않으면 에러 메세지를 띄운다. datatype validation
  • class extended with BaseModel를 정의하여 사용

Example_1

from datetime import datetime
from pydantic import BaseModel


class User(BaseModel):
    id: int
    name = 'John Doe'
    
    # signup_ts: Optional[datetime] = None
    signup_ts: datetime | None = None # python 3.10 and above
    friends: list[int] = []


external_data = {
    'id': '123',
    'signup_ts': '2019-06-01 12:22',
    'friends': [1, 2, '3'],
}
user = User(**external_data)
print(user.id)
#> 123
print(repr(user.signup_ts))
#> datetime.datetime(2019, 6, 1, 12, 22)
print(user.friends)
#> [1, 2, 3]
print(user.dict())
"""
{
    'id': 123,
    'signup_ts': datetime.datetime(2019, 6, 1, 12, 22),
    'friends': [1, 2, 3],
    'name': 'John Doe',
}
"""
  • id는 정수로 annotation되어 있어, 입력을 '123'로 받지만 123으로 parsing된다. + required variable
  • name은 default value를 가지고 있어 required하지 않다.
  • signup_ts는 datetime이지만 default 값으로 None을 갖고 Optional하다. Optional은 default 값을 가지고 있지 않아도 된다.
  • friends, 정수형 원소를 갖는 리스트를 받는다. 역시 '3'을 parsing을 통해 3: int로 받는다.

Example_2, validation_error

from pydantic import ValidationError

try:
    User(signup_ts='broken', friends=[1, 2, 'not number'])
except ValidationError as e:
    print(e.json())

Starlette

web framework

Starlette is a lightweight ASGI framework/toolkit, which is ideal for building async web services in Python.

OpenAPI

swagger

정확히는 OpenAPI Specification으로,
REST API를 json이나 yaml로 규칙에 맞게 기술하는 방식

밑의 포스팅을 참고할 것
https://gruuuuu.github.io/programming/openapi/

Build environment

miniconda

dependency management tool

AI 프로젝트를 진행하던 중, gcp 서버 내에서 아나콘다로 인한 충돌을 경험해 더 이상 쓰지 않을 거라 생각했다. 백엔드 프로젝트를 진행할 때는 다를 수도 있다는 기대감에 다시 사용해보려한다.

필요없는 라이브러리를 포함하지 않는 miniconda로 진행
homebrew로 설치하면 경로 관련해서 문제가 생길 수도 있지만 일단은 brew로 다운

poetry

주의해야할 것이 poetry add로 라이브러리를 설치하고 install로 환경을 복원한다.

  • poetry를 고른 이유(pipenv과의 속도 비교)

https://www.youtube.com/watch?v=aZTmnCkCa3M

  • poetry 사용법

https://blog.gyus.me/2020/introduce-poetry/

  • poetry 자세한 내용, 가상환경, lock file

https://python-poetry.org/docs/basic-usage/#installing-dependencies

REST API

아마도 지금의 나는 정리해봤자 와닿지 않을 것이다.

그래도 keywork로 정리하면,

  • URI
  • Resource
  • Collection, Element
  • HTTP method, GET, PUT, PATCH, DELETE, POST

생활코딩 https://youtu.be/PmY3dWcCxXI
블로그 포스팅 https://bentist.tistory.com/37

Status code

https://www.moesif.com/blog/technical/api-design/Which-HTTP-Status-Code-To-Use-For-Every-CRUD-App/

상황에 맞게 status code를 사용할 것

ORM

  • 귀에 박히는 강의

https://youtu.be/VTqqZSuSdOk

  • 보다 자세한

https://gmlwjd9405.github.io/2019/02/01/orm.html

SQLAlchemy

engine, session, Base class 생성

database connection

python에서 사용하는 orm library

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"
# SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db"

engine = create_engine(
    SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

schema 작성

Create Model, using tableplus

fastapi 문서에서, 모델을 만든 다는 것은 schema를 class로 작성하는 것을 의미

from sqlalchemy import Column, String, Integer
from .database import Base


class Blog(Base):
    __tablename__ = 'blogs'
    
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String)
    body = Column(String)

참고

  • 위 포스팅은 다음 영상의 과정을 참고하였습니다.

https://youtu.be/7t2alSnE2-I

  • FastAPI docs

https://fastapi.tiangolo.com/

  • My github

https://github.com/jujemu/web_project

0개의 댓글