🚀 ニフティ’s Notion

🌞 【Webアプリ2024 #10】(バックエンド)フレームワークとは

バックエンドフレームワークの概要

バックエンドフレームワークとは、Web アプリケーションやAPI等のサーバーサイド処理を効率的に開発するためのツールキット

特徴

MVCアーキテクチャ
  • MVC(モデル・ビュー・コントローラー)
    • Model:システムの中でデータアクセス、ビジネスロジックを担当
    • View:ユーザーが見ることや操作することができる部分全体を担当
    • Controller:ユーザーからのリクエストを受け取り、Modelの操作とViewの更新を担当
MTV(補足)
  • MTV(モデル・テンプレート・ビュー)
    • Model:システムの中でデータアクセス、ビジネスロジックを担当
    • Template:ウェブページやその他の出力の表示を定義するためのマークアップとロジックを担当
      • ≒htmlファイル
    • View:テンプレートのレンダリングやクライアントに提供される出力の生成を担当
    ChatGPTにViewの違いを聞いてみた
    主な違いは以下のとおりです
    MVCのViewはユーザーインターフェースの定義とロジックを含むのに対し、MTVのViewはテンプレートファイルに特化している点
    MVCのViewはコントローラーと密結合しているが、MTVのViewはコントローラーから独立している点
    MVCのViewはユーザー入力の処理を行うが、MTVのViewはそうではない点
    つまり、MVCのViewはより動的で複雑な機能を持つのに対し、MTVのViewはプレゼンテーション層に特化したシンプルな構造となっています。

テンプレートエンジン

テンプレートエンジンは、動的なウェブページやドキュメントを生成する際に使用されるツール。静的なコンテンツと動的なデータを組み合わせて、最終的な出力を生成するための仕組み。テンプレートの中に変数を埋め込むことで、動的なコンテンツを表示できます。

image block

ルーティング

バックエンドフレームワークにおけるルーティングは、クライアントからのリクエストを受け取り、それに対応する処理を実行するための手段。(FastAPIを例に説明)

  • ルートの定義
    • エンドポイントを設定すること
    • 〇〇.com/home
    • 〇〇.com/user
  • HTTPメソッドの設定
    • クライアントからのHTTPリクエストのメソッドに応じて、異なる処理を行う
    • Fast APIではデコレータを使用して設定
    • @app.get("/user")
  • パラメーターの設定
    • URLにパラメーターを含めることができる
    • @app.get("/users/{user_id}")

バックエンドフレームワークの種類

フレームワーク 言語 分類
FastAPI Python マイクロ
Django Python フルスタック
Ruby on Rails Ruby フルスタック
Spring Framework Java フルスタック
Gin Web Framework Go マイクロ
  • フルスタックフレームワーク
    • DBアクセス用ライブラリなどを含めて、 Webアプリケーションを構成する機能を全て提供するフレームワーク
    • オールインワン
  • マイクロフレームワーク
    • Webサーバ・ルーティング機能のみを持つフレームワーク
    • その他の機能は自分でライブラリを選んで導入する

FastAPI

FastAPI は、Pythonの標準である型ヒントに基づいてPython 以降でAPI を構築するための、モダンで、高速(高パフォーマンス)な、Web フレームワークです。

FastAPIの特徴

FastAPIの使い方

公式のチュートリアル に沿って簡単に説明します

最もシンプルなFastAPIファイル

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

パスパラメータ

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_item(item_id):
    return {"item_id": item_id}

クエリパラメータ

from fastapi import FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]


@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip : skip + limit]

sqlalchemyのモデル

sqlalchemy:FastAPIとよく一緒に使用されるORMの一つ

ℹ️
ORM(Object-Relational Mapping)
クラスオブジェクトとRDBテーブルとのマッピングを行うもの

SQLデータベースの構造を定義するためのクラス

from sqlalchemy.orm import Mapped, mapped_column

class User(Base):
    __tablename__ = "user"

    id: Mapped[int] = mapped_column(primary_key=True)
    email: Mapped[str] = mapped_column(unique=True, nullable=False)
    password: Mapped[str] = mapped_column(nullable=False)
    name: Mapped[str] = mapped_column(nullable=False)

sqlalchemyのDB操作

  • ORMっぽい操作の query() 、SQLっぽい操作の scalars() がありますが scalars が推奨
from sqlalchemy import select

from .models import User

def get_user(db: Session, user_id: int):
    return db.scalars(select(User).where(User.id == user_id)).first()
    # Primary Key指定であればget()の方がシンプルに使える
    # return db.get(User, user_id)

# async/await対応版
# AsyncSessionを使うこと、asyn・awaitが追加になること以外は同一
async def get_user(db: AsyncSession, user_id: int):
    return await db.scalars(select(User).where(User.id == user_id)).first()

PydanticのBaseModel

データの入力/出力を定義するためのクラス

from pydantic import BaseModel, EmailStr

class UserIn(BaseModel):
    username: str
    password: str
    email: EmailStr
    full_name: Union[str, None] = None