Flask-SQLAlchemyを使って記事とユーザーを管理するシステムを構築するには、まずFlaskフレームワークの基礎を理解し、次にFlask-SQLAlchemyを用いてデータベースと連携する方法を学ぶことが必要です。この記事では、Flask-SQLAlchemyを使用して記事とユーザーの情報を効率的に管理するシステムを構築する方法について、完全かつ包括的に説明します。
1. FlaskとSQLAlchemyのインストール
まず、FlaskとSQLAlchemyをプロジェクトにインストールする必要があります。次のコマンドを実行して、FlaskとFlask-SQLAlchemyをインストールします。

bashpip install flask flask_sqlalchemy
インストールが完了したら、Flaskアプリケーションを作成する準備が整いました。
2. プロジェクト構造
次に、プロジェクトの基本的な構造を作成します。以下のようにファイルを配置します。
cppmyproject/
│
├── app.py
├── models.py
├── templates/
│ └── index.html
└── static/
-
app.py
:Flaskアプリケーションのエントリーポイント。 -
models.py
:データベースモデル(記事とユーザー)を定義。 -
templates/
:HTMLテンプレートを格納。 -
static/
:CSSやJavaScriptなどの静的ファイルを格納。
3. データベース設定
Flask-SQLAlchemyを使用するために、アプリケーションの設定を行います。app.py
内で、データベースのURLを設定し、SQLAlchemyを初期化します。
pythonfrom flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# データベース設定(SQLiteを使用)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# SQLAlchemyの初期化
db = SQLAlchemy(app)
from models import User, Article
if __name__ == "__main__":
app.run(debug=True)
ここでは、SQLiteをデータベースとして使用していますが、MySQLやPostgreSQLなど他のデータベースに変更することもできます。
4. モデルの定義
次に、models.py
ファイルでユーザーと記事のデータベースモデルを定義します。Flask-SQLAlchemyでは、db.Model
を継承したクラスを作成することで、テーブルを定義できます。
pythonfrom datetime import datetime
from app import db
# ユーザーモデル
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(60), nullable=False)
# リレーションシップ(1対多)
articles = db.relationship('Article', backref='author', lazy=True)
def __repr__(self):
return f"User('{self.username}', '{self.email}')"
# 記事モデル
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
# 外部キー(ユーザーID)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
def __repr__(self):
return f"Article('{self.title}', '{self.date_posted}')"
-
User
モデルは、ユーザーの情報(ユーザー名、メールアドレス、パスワード)を格納します。 -
Article
モデルは、記事の情報(タイトル、コンテンツ、投稿日)を格納し、user_id
という外部キーを持って、どのユーザーがその記事を作成したかを示します。
5. データベースの作成
モデルを定義した後、Flask-SQLAlchemyでデータベースを作成する必要があります。以下のコマンドをPythonシェルで実行します。
pythonfrom app import db
db.create_all()
これで、User
とArticle
テーブルがデータベースに作成されます。
6. ユーザー登録と記事投稿の処理
ユーザー登録と記事投稿の機能を実装します。まず、app.py
にルーティングと処理を追加します。
pythonfrom flask import render_template, request, redirect, url_for
from app import app, db
from models import User, Article
# ユーザー登録ページ
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
email = request.form['email']
password = request.form['password'] # パスワードのハッシュ化は後で行う
user = User(username=username, email=email, password=password)
db.session.add(user)
db.session.commit()
return redirect(url_for('login')) # ログインページにリダイレクト
return render_template('register.html')
# 記事投稿ページ
@app.route('/article/new', methods=['GET', 'POST'])
def new_article():
if request.method == 'POST':
title = request.form['title']
content = request.form['content']
author = User.query.first() # 仮に最初のユーザーを作者として設定
article = Article(title=title, content=content, author=author)
db.session.add(article)
db.session.commit()
return redirect(url_for('index'))
return render_template('new_article.html')
# トップページ(記事一覧)
@app.route('/')
def index():
articles = Article.query.all()
return render_template('index.html', articles=articles)
-
/register
:ユーザー登録ページ。 -
/article/new
:新しい記事を投稿するページ。 -
/
:記事の一覧ページ。
7. HTMLテンプレートの作成
Flaskでは、HTMLテンプレートをtemplates/
ディレクトリ内に配置します。例えば、register.html
、new_article.html
、index.html
を作成します。
register.html
htmlhtml>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ユーザー登録title>
head>
<body>
<h1>ユーザー登録h1>
<form method="POST">
<label for="username">ユーザー名:label>
<input type="text" name="username" required><br>
<label for="email">メールアドレス:label>
<input type="email" name="email" required><br>
<label for="password">パスワード:label>
<input type="password" name="password" required><br>
<button type="submit">登録button>
form>
body>
html>
new_article.html
htmlhtml>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>新しい記事の投稿title>
head>
<body>
<h1>新しい記事の投稿h1>
<form method="POST">
<label for="title">タイトル:label>
<input type="text" name="title" required><br>
<label for="content">コンテンツ:label>
<textarea name="content" required>textarea><br>
<button type="submit">投稿button>
form>
body>
html>
index.html
htmlhtml>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>記事一覧title>
head>
<body>
<h1>記事一覧h1>
<ul>
{% for article in articles %}
<li>
<h2>{{ article.title }}h2>
<p>{{ article.content }}p>
<small>投稿日: {{ article.date_posted }}small>
li>
{% endfor %}
ul>
body>
html>
8. 実行
アプリケーションを実行するには、app.py
を実行します。
bashpython app.py
これで、Flaskアプリケーションが立ち上がり、ユーザーの登録や記事の投稿ができるようになります。
9. まとめ
この記事では、Flask-SQLAlchemyを使用してユーザーと記事を管理するシステムを構築する方法を説明しました。データベースの設計から、Flaskのルーティング、HTMLテンプレートの作成、そして実際の実装までを一通り解説しました。この方法を