バックエンドフレームワークの概要
バックエンドフレームワークとは、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はプレゼンテーション層に特化したシンプルな構造となっています。
テンプレートエンジン
テンプレートエンジンは、動的なウェブページやドキュメントを生成する際に使用されるツール。静的なコンテンツと動的なデータを組み合わせて、最終的な出力を生成するための仕組み。テンプレートの中に変数を埋め込むことで、動的なコンテンツを表示できます。
ルーティング
バックエンドフレームワークにおけるルーティングは、クライアントからのリクエストを受け取り、それに対応する処理を実行するための手段。(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の特徴
- Pythonのフレームワークの中では速い
- Flaskの構文に近いので、Flaskを学習したことある人からすると学習コストが低い
- Python3.5から導入された非同期処理(async/await)がフレームワークレベルでサポートされている
-
APIのドキュメントが自動で生成される(OpenAPIフォーマット)
- yamlまたはJSONで書かれたREST APIのドキュメント
-
FastAPI上で2種類の方法で表示できる
- Swagger UI
-
ReDoc
- Swagger UIより新しい
-
型チェックによりAPIの入力値の型を制御できる
- 型チェックにはPydanticが使われている
- エンジニアブログでも紹介
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の一つ
クラスオブジェクトと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