Beherrschung von FastAPI: Organisation größerer Anwendungen mit mehreren Dateien für ein nahtloses Benutzererlebnis

FastAPI ist schnell zu einer beliebten Wahl unter Webentwicklern geworden, dank seiner Einfachheit, Leistung und Benutzerfreundlichkeit. Mit dem Wachstum Ihrer Anwendung wird es entscheidend, eine saubere und organisierte Codebasis zu pflegen. In diesem Blogbeitrag werden wir bewährte Methoden zur Strukturierung größerer FastAPI-Anwendungen mit mehreren Dateien untersuchen, um ein nahtloses Benutzererlebnis zu gewährleisten.

Warum sollten Sie Ihre FastAPI-Anwendung organisieren?

Die Organisation Ihrer FastAPI-Anwendung in mehrere Dateien ist aus mehreren Gründen unerlässlich:

  • Lesbarkeit: Eine gut strukturierte Codebasis ist leichter zu navigieren und zu verstehen.
  • Wartbarkeit: Isolierte Komponenten reduzieren die Komplexität und erleichtern das Aktualisieren und Debuggen des Codes.
  • Zusammenarbeit: Eine modulare Struktur ermöglicht es mehreren Entwicklern, gleichzeitig an verschiedenen Teilen der Anwendung zu arbeiten.

Projektstruktur

Eine typische Struktur für eine größere FastAPI-Anwendung könnte so aussehen:

project_root/
├── app/
│   ├── __init__.py
│   ├── main.py
│   ├── routers/
│   │   ├── __init__.py
│   │   ├── users.py
│   │   ├── items.py
│   ├── models/
│   │   ├── __init__.py
│   │   ├── user.py
│   │   ├── item.py
│   ├── schemas/
│   │   ├── __init__.py
│   │   ├── user.py
│   │   ├── item.py
│   ├── databases.py
├── tests/
│   ├── __init__.py
│   ├── test_users.py
│   ├── test_items.py
├── requirements.txt

Jeder Ordner hat einen bestimmten Zweck:

  • app/: Enthält die Hauptanwendungsdateien.
  • routers/: Beinhaltet die Routenlogik (Endpunkte), aufgeteilt in verschiedene Module.
  • models/: Enthält die Datenbankmodelle.
  • schemas/: Definiert die Pydantic-Modelle zur Datenvalidierung.
  • databases.py: Richtet die Datenbankverbindung ein.
  • tests/: Beinhaltet Testfälle für die Anwendung.

Einrichten der Hauptanwendung

Beginnen wir mit der Einrichtung der Hauptanwendungsdatei main.py:

from fastapi import FastAPI
from .routers import users, items

app = FastAPI()

app.include_router(users.router)
app.include_router(items.router)

Diese Datei initialisiert die FastAPI-App und bindet Router für Benutzer und Artikel ein.

Erstellen von Routern

Als Nächstes erstellen wir Router-Dateien für unsere Anwendung. Zum Beispiel hier der users.py-Router:

from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from .. import models, schemas, databases

router = APIRouter(prefix="/users", tags=["users"])

@router.post("/", response_model=schemas.User)
def create_user(user: schemas.UserCreate, db: Session = Depends(databases.get_db)):
    db_user = models.User(name=user.name, email=user.email)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user

Dieser Router übernimmt die Benutzerserstellung und nutzt Dependency Injection für die Datenbanksitzung.

Einrichten von Modellen und Schemas

Für Datenbankmodelle definieren wir ein einfaches Benutzermodell in user.py:

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

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    email = Column(String, unique=True, index=True)

Und hier ist ein Pydantic-Schema zur Benutzervalidierung in user.py unter schemas/:

from pydantic import BaseModel

class UserBase(BaseModel):
    name: str
    email: str

class UserCreate(UserBase):
    pass

class User(UserBase):
    id: int

    class Config:
        orm_mode = True

Diese Schemata sichern die Datenvalidität und -serialisierung.

Datenbankkonfiguration

Richten Sie abschließend die Datenbankverbindung in databases.py ein:

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

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"

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

 def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

Diese Konfiguration verwendet SQLite zur Vereinfachung, kann jedoch für andere Datenbanken angepasst werden.

Fazit

In diesem Beitrag haben wir erläutert, wie man eine größere FastAPI-Anwendung in mehrere Dateien organisiert, um die Lesbarkeit, Wartbarkeit und Zusammenarbeit zu verbessern. Durch die Strukturierung Ihrer Anwendung mit einer klaren Trennung der Verantwortlichkeiten können Sie eine skalierbarere und verwaltbarere Codebasis gewährleisten. Beginnen Sie noch heute mit der Refaktorisierung Ihrer FastAPI-Projekte, um die Vorteile einer gut organisierten Anwendung zu erleben!

Handlungsaufforderung: Versuchen Sie, Ihre bestehende FastAPI-Anwendung gemäß der in diesem Beitrag beschriebenen Struktur neu zu organisieren. Teilen Sie Ihre Erfahrungen in den Kommentaren unten!