μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

fastAPI 둜 λ°±μ—”λ“œ μ‹œμž‘ν•˜κΈ° (ν™˜κ²½ μ„ΈνŒ…, 폴더 ꡬ쑰, mysql μ‚¬μš©)

주영 🐱 2024. 4. 18. 09:01
728x90
λ°˜μ‘ν˜•

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)

 

λ°˜μ‘ν˜•