プログラミング

Flaskで記事とユーザー管理

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

1. FlaskとSQLAlchemyのインストール

まず、FlaskとSQLAlchemyをプロジェクトにインストールする必要があります。次のコマンドを実行して、FlaskとFlask-SQLAlchemyをインストールします。

bash
pip install flask flask_sqlalchemy

インストールが完了したら、Flaskアプリケーションを作成する準備が整いました。

2. プロジェクト構造

次に、プロジェクトの基本的な構造を作成します。以下のようにファイルを配置します。

cpp
myproject/ │ ├── 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を初期化します。

python
from 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を継承したクラスを作成することで、テーブルを定義できます。

python
from 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シェルで実行します。

python
from app import db db.create_all()

これで、UserArticleテーブルがデータベースに作成されます。

6. ユーザー登録と記事投稿の処理

ユーザー登録と記事投稿の機能を実装します。まず、app.pyにルーティングと処理を追加します。

python
from 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.htmlnew_article.htmlindex.htmlを作成します。

register.html

html
html> <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

html
html> <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

html
html> <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を実行します。

bash
python app.py

これで、Flaskアプリケーションが立ち上がり、ユーザーの登録や記事の投稿ができるようになります。

9. まとめ

この記事では、Flask-SQLAlchemyを使用してユーザーと記事を管理するシステムを構築する方法を説明しました。データベースの設計から、Flaskのルーティング、HTMLテンプレートの作成、そして実際の実装までを一通り解説しました。この方法を

Back to top button