
「リポジトリパターンってなに?」「Flaskってよく聞くけどよくわかんない。。」
そんな文系SEさん向けに、Flaskを使ったリポジトリパターンの実践例を、試してみたので、紹介します。
この記事は広告を含みます。
☕ Flaskって何?
📘 Flaskとは? → PythonでWebアプリケーションを作るための超シンプルなフレームワークです。 - 軽量で学習コストが低い - ファイル1つからWebアプリが作れる - 書き方が直感的で、初心者にもおすすめ 実際に「Webフォームからユーザーを登録して一覧表示する」簡単なアプリを作ってみながら、Flaskの雰囲気をつかんでみましょう。
🧠 リポジトリパターンって?
📦 リポジトリパターンとは? → データベースへのアクセス処理を「専用のクラス」にまとめて、アプリ本体のコードと分離する設計パターンです。 - アプリの本来のロジックに集中できる - データの保存方法を後から変えやすい(例:メモリ → DB → API) - テストがしやすくなる(DBに依存しない) この考え方をFlaskアプリにも取り入れると、コードの見通しがよくなって超スッキリします✨
🛠 実装してみよう!Flask × リポジトリ
今回作るのは、「名前を入力 → 登録 → 一覧表示」という、めっちゃシンプルなユーザー管理アプリです。
Pythonのインストール
Pythonのインストールや開発環境の作り方は以下をご参照ください。
Flaskのインストール
pip install flask
📁 ファイル構成(イメージ)
myapp/ ├── app.py ← Flaskアプリ本体 ├── models/ │ └── user.py ← Userエンティティ ├── repositories/ │ ├── interface.py ← 抽象リポジトリ │ └── memory_user_repo.py ← 実装リポジトリ(メモリ版)
※フォルダにはそれぞれ__init__.pyを作っています。
① ユーザーモデル(models/user.py)
class User: def __init__(self, user_id: int, name: str): self.user_id = user_id self.name = name
② リポジトリのインターフェース(repositories/interface.py)
from abc import ABC, abstractmethod from models.user import User class UserRepository(ABC): @abstractmethod def get_all(self) -> list[User]: pass @abstractmethod def save(self, user: User) -> None: pass
③ メモリ上で保存するリポジトリ(repositories/memory_user_repo.py)
from repositories.interface import UserRepository from models.user import User class InMemoryUserRepository(UserRepository): def __init__(self): self.users = [] self.next_id = 1 def get_all(self) -> list[User]: return self.users def save(self, user: User) -> None: user.user_id = self.next_id self.next_id += 1 self.users.append(user)
④ Flaskアプリ本体(app.py)
from flask import Flask, request, render_template_string, redirect from models.user import User from repositories.memory_user_repo import InMemoryUserRepository app = Flask(__name__) user_repo = InMemoryUserRepository() HTML_TEMPLATE = """ <h1>ユーザー登録</h1> <form method="post"> 名前: <input type="text" name="name"> <input type="submit" value="登録"> </form> <h2>登録済みユーザー</h2> <ul> {% for user in users %} <li>{{ user.user_id }}: {{ user.name }}</li> {% endfor %} </ul> """ @app.route("/", methods=["GET", "POST"]) def index(): if request.method == "POST": name = request.form["name"] user = User(user_id=None, name=name) user_repo.save(user) return redirect("/") users = user_repo.get_all() return render_template_string(HTML_TEMPLATE, users=users) if __name__ == "__main__": app.run(debug=True)
文系SE視点のまとめ
Flask × リポジトリパターンのポイント
「後で変えたくなるかも…」という未来の自分への優しさですね。。
次のステップに向けて…
明日はこのリポジトリを「DynamoDB対応」に書き換えてみるのもアリかもですね!
など、リポジトリパターンの強さがさらに見えてきます💪


