fastAPI λ‘ λ°±μλ μμνκΈ° (νκ²½ μΈν , ν΄λ ꡬ쑰, mysql μ¬μ©)
flaskλ₯Ό μ¨λ΄€λ€λ©΄ μ‘°κΈ μ΅μν μλ μλ€.
μμ μ°Έκ³
https://github.com/tiangolo/full-stack-fastapi-template
GitHub - tiangolo/full-stack-fastapi-template: Full stack, modern web application template. Using FastAPI, React, SQLModel, Post
Full stack, modern web application template. Using FastAPI, React, SQLModel, PostgreSQL, Docker, GitHub Actions, automatic HTTPS and more. - tiangolo/full-stack-fastapi-template
github.com
λμ κ²½μ°μλ λ€μκ³Ό κ°μ΄ μ§°λ€.
.
βββ app
β βββ __init__.py
β βββ main.py
β βββ database.py
β βββ models.py
β βββ schemas.py
β βββ crud.py
β βββ routers -(κ°μ’
λΌμ°ν°λ€)
β βββ __init__.py
β βββ japanese.py
β βββ known.py
βββ tests
β βββ __init__.py
β βββ test_database.py
β βββ test_main.py
βββ requirements.txt
βββ .env
βββ README.md
- requirements.txt
μΌλ¨ κ°μνκ²½μ μμ±ν ν, νμν ν¨ν€μ§λ€μ μ€μΉνλ€.
μ΄λ€μ requirements.txtλ‘ κ΄λ¦¬νλ€
fastapi
uvicorn
sqlalchemy
mysqlclient
python-dotenv
pydantic
- FastAPIμ ν¨κ» MySQLμ μ¬μ©νλ €λ©΄, mysqlclientλ aiomysql κ°μ MySQL λ°μ΄ν°λ² μ΄μ€ λλΌμ΄λ²κ° νμν©λλ€. python-dotenvλ νκ²½ λ³μλ₯Ό κ΄λ¦¬νκΈ° μν΄ μ¬μ©ν©λλ€. SQLAlchemyλ ORMμ μ 곡ν©λλ€.
- .env
λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ νμν μ 보λ₯Ό μ μ₯
DATABASE_URL=mysql://user:password@localhost/dbname
μ£Όμ κ΅¬μ± μμ μ€λͺ
- "app" ν΄λλ λͺ¨λ μμ€ μ½λλ₯Ό ν¬ν¨ν©λλ€.
- app/main.py: FastAPI μ± μΈμ€ν΄μ€λ₯Ό μμ±νκ³ λΌμ°ν°λ₯Ό ν¬ν¨νλ νμΌμ λλ€. μ΄ νμΌμμ μ± μ€μ μ μ§νν©λλ€.
- app/database.py: λ°μ΄ν°λ² μ΄μ€ μ°κ²°κ³Ό μΈμ κ΄λ¦¬λ₯Ό μν μ€μ μ ν¬ν¨ν©λλ€. SQLAlchemyλ₯Ό μ¬μ©νλ μμμ λλ€.
- app/models.py: λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ SQLAlchemy λͺ¨λΈλ‘ μ μν©λλ€. μ΄ μμμμλ japanese λ° known ν μ΄λΈμ ν΄λΉνλ λͺ¨λΈμ μ μν©λλ€.
- app/schemas.py: ν΄λΌμ΄μΈνΈμμ λ°μ΄ν° κ΅νμ μ¬μ©λλ Pydantic λͺ¨λΈ(μ€ν€λ§)μ μ μν©λλ€. μμ² λ° μλ΅ μ€ν€λ§λ₯Ό μ μνλ κ³³μ λλ€.
- app/crud.py: λ°μ΄ν°λ² μ΄μ€μ CRUD μ°μ°μ μννλ ν¨μλ€μ μ μν©λλ€. μ΄ ν¨μλ€μ μΌλ°μ μΌλ‘ λͺ¨λΈκ³Ό μ€ν€λ§λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€μμ μνΈμμ©μ μΊ‘μνν©λλ€.
- app/routers/: κ° κΈ°λ₯λ³λ‘ κ²½λ‘ μ°μ°μ λλμ΄ κ΄λ¦¬νκΈ° μν λΌμ°ν° νμΌλ€μ ν¬ν¨νλ λλ ν 리μ λλ€. μλ₯Ό λ€μ΄, japanese κ΄λ ¨ κ²½λ‘λ japanese.pyμ, known κ΄λ ¨ κ²½λ‘λ known.pyμ μ μν©λλ€.
- tests/: FastAPI μ ν리μΌμ΄μ μ ν μ€νΈ μ½λλ₯Ό ν¬ν¨νλ λλ ν 리μ λλ€. μ¬κΈ°μλ λ°μ΄ν°λ² μ΄μ€ μ°κ²° ν μ€νΈ, API μλν¬μΈνΈ ν μ€νΈ λ±μ΄ ν¬ν¨λ μ μμ΅λλ€.
- requirements.txt: νλ‘μ νΈμ νμν Python ν¨ν€μ§ λͺ©λ‘μ λλ€. μλ₯Ό λ€μ΄, fastapi, uvicorn, pydantic, SQLAlchemy, mysql-connector-python λ±μ΄ ν¬ν¨λ μ μμ΅λλ€.
- database.py
MySQL λ°μ΄ν°λ² μ΄μ€μ μ°κ²°μ κ΄λ¦¬νλ μ½λμ λλ€. SQLAlchemy create_engine ν¨μλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€ μμ§μ μμ±νκ³ , SessionLocal ν΄λμ€λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€ μΈμ μ κ΄λ¦¬ν©λλ€.
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import os
from dotenv import load_dotenv
load_dotenv()
DATABASE_URL = os.getenv("DATABASE_URL")
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
- models.py
λ°μ΄ν°λ² μ΄μ€ λͺ¨λΈμ SQLAlchemy ORMμ μ¬μ©νμ¬ μ μν©λλ€. μλ₯Ό λ€μ΄, Japaneseμ Known ν μ΄λΈμ μ μν μ μμ΅λλ€.
from sqlalchemy import Column, Integer, String, Date
from .database import Base
class Japanese(Base):
__tablename__ = "japanese"
id = Column(Integer, primary_key=True, index=True)
word = Column(String, index=True)
meaning = Column(String)
class Known(Base):
__tablename__ = "known"
id = Column(Integer, primary_key=True, index=True)
word_id = Column(Integer, index=True)
review_date = Column(Date)