Flaskでリポジトリパターンを使ってみよう|文系SE向けやさしい入門

「リポジトリパターンってなに?」「Flaskってよく聞くけどよくわかんない。。」
そんな文系SEさん向けに、Flaskを使ったリポジトリパターンの実践例を、試してみたので、紹介します。

この記事は広告を含みます。


☕ Flaskって何?

📘 Flaskとは?

→ PythonでWebアプリケーションを作るための超シンプルなフレームワークです。

- 軽量で学習コストが低い
- ファイル1つからWebアプリが作れる
- 書き方が直感的で、初心者にもおすすめ

実際に「Webフォームからユーザーを登録して一覧表示する」簡単なアプリを作ってみながら、Flaskの雰囲気をつかんでみましょう。

🧠 リポジトリパターンって?

📦 リポジトリパターンとは?

→ データベースへのアクセス処理を「専用のクラス」にまとめて、アプリ本体のコードと分離する設計パターンです。

- アプリの本来のロジックに集中できる
- データの保存方法を後から変えやすい(例:メモリ → DB → API)
- テストがしやすくなる(DBに依存しない)

この考え方をFlaskアプリにも取り入れると、コードの見通しがよくなって超スッキリします✨

🛠 実装してみよう!Flask × リポジトリ

今回作るのは、「名前を入力 → 登録 → 一覧表示」という、めっちゃシンプルなユーザー管理アプリです。


Pythonのインストール

Pythonのインストールや開発環境の作り方は以下をご参照ください。

kunio-ud-all.com

kunio-ud-all.com

Flaskのインストール

pip install flask

flask.palletsprojects.com

📁 ファイル構成(イメージ)

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 × リポジトリパターンのポイント
  • Flaskは「最小構成」でWebアプリが作れる
  • リポジトリを使うと「データ保存ロジック」がアプリ本体と分離できてキレイ
  • データの保存先をDynamoDBやSQLに変えたいときも、アプリ側はほぼそのまま!
  • 「後で変えたくなるかも…」という未来の自分への優しさですね。。


    次のステップに向けて…

    明日はこのリポジトリを「DynamoDB対応」に書き換えてみるのもアリかもですね!

  • boto3を使ったDynamoDB操作
  • DynamoDBUserRepositoryの実装
  • インターフェースを活かした差し替え
  • など、リポジトリパターンの強さがさらに見えてきます💪