Flask によるブログアプリケーション

FlaskFlaskBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Python の人気のある Web フレームワークである Flask を使ってブログアプリケーションを作成する方法を学びます。このアプリケーションでは、すべてのブログ投稿を一覧表示し、ログインしたユーザーが投稿を作成できるようにし、著者が自分の投稿を編集または削除できるようにします。

注:コードファイルは自分で作成し、環境で実行する必要があります。Web 5000 で Flask サービスの状態をプレビューできます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL flask(("Flask")) -.-> flask/CoreConceptsGroup(["Core Concepts"]) flask(("Flask")) -.-> flask/DevelopmentToolsGroup(["Development Tools"]) flask(("Flask")) -.-> flask/DataHandlingGroup(["Data Handling"]) flask/DataHandlingGroup -.-> flask/incoming_request_data("Incoming Request Data") flask/DataHandlingGroup -.-> flask/response_objects("Response Objects") flask/CoreConceptsGroup -.-> flask/application_object("Application Object") flask/CoreConceptsGroup -.-> flask/sessions("Sessions") flask/CoreConceptsGroup -.-> flask/session_interface("Session Interface") flask/CoreConceptsGroup -.-> flask/class_based_views("Class-Based Views") flask/CoreConceptsGroup -.-> flask/useful_internals("Useful Internals") flask/DevelopmentToolsGroup -.-> flask/blueprint_objects("Blueprint Objects") flask/DevelopmentToolsGroup -.-> flask/command_line_interface("Command Line Interface") subgraph Lab Skills flask/incoming_request_data -.-> lab-136340{{"Flask によるブログアプリケーション"}} flask/response_objects -.-> lab-136340{{"Flask によるブログアプリケーション"}} flask/application_object -.-> lab-136340{{"Flask によるブログアプリケーション"}} flask/sessions -.-> lab-136340{{"Flask によるブログアプリケーション"}} flask/session_interface -.-> lab-136340{{"Flask によるブログアプリケーション"}} flask/class_based_views -.-> lab-136340{{"Flask によるブログアプリケーション"}} flask/useful_internals -.-> lab-136340{{"Flask によるブログアプリケーション"}} flask/blueprint_objects -.-> lab-136340{{"Flask によるブログアプリケーション"}} flask/command_line_interface -.-> lab-136340{{"Flask によるブログアプリケーション"}} end

ブループリントを定義する

まず、ブログ用のブループリントを定義します。ブループリントは、関連するビューやその他のコードのグループを整理する方法です。

## flaskr/blog.py

from flask import Blueprint, flash, g, redirect, render_template, request, url_for
from werkzeug.exceptions import abort

from flaskr.auth import login_required
from flaskr.db import get_db

## ブループリントは 'blog' と名付けられています。同じファイル内で定義されています。
## ブループリントは自分自身が定義されている場所を知る必要があるため、2 番目の引数として __name__ が渡されます。
bp = Blueprint('blog', __name__)

ブループリントを登録する

次に、アプリケーションにブループリントを登録します。

## flaskr/__init__.py

def create_app():
    app =...
    ## 既存のコードは省略
    ## ファクトリーからブループリントをインポートし、app.register_blueprint() を使って登録
    from. import blog
    app.register_blueprint(blog.bp)
    app.add_url_rule('/', endpoint='index')

    return app

ブログのインデックスを作成する

さて、すべてのブログ投稿を表示するインデックスビューを作成しましょう。結果に user テーブルからの著者情報を含めるために、SQL の JOIN を使用します。

## flaskr/blog.py

@bp.route('/')
def index():
    db = get_db()
    posts = db.execute(
        'SELECT p.id, title, body, created, author_id, username'
        ' FROM post p JOIN user u ON p.author_id = u.id'
        ' ORDER BY created DESC'
    ).fetchall()
    return render_template('blog/index.html', posts=posts)

投稿の作成

次に、ログインしたユーザーが新しいブログ投稿を作成できるようにするビューを作成します。

## flaskr/blog.py

@bp.route('/create', methods=('GET', 'POST'))
@login_required
def create():
    if request.method == 'POST':
        title = request.form['title']
        body = request.form['body']
        error = None

        if not title:
            error = 'Title is required.'

        if error is not None:
            flash(error)
        else:
            db = get_db()
            db.execute(
                'INSERT INTO post (title, body, author_id)'
                ' VALUES (?,?,?)',
                (title, body, g.user['id'])
            )
            db.commit()
            return redirect(url_for('blog.index'))

    return render_template('blog/create.html')

投稿の更新

著者が自分の投稿を更新できる機能を追加します。コードの重複を避けるため、投稿を取得して現在のユーザーが著者であるかどうかを確認するためのヘルパー関数を作成します。

## flaskr/blog.py

@bp.route('/<int:id>/update', methods=('GET', 'POST'))
@login_required
def update(id):
    post = get_post(id)

    if request.method == 'POST':
        title = request.form['title']
        body = request.form['body']
        error = None

        if not title:
            error = 'Title is required.'

        if error is not None:
            flash(error)
        else:
            db = get_db()
            db.execute(
                'UPDATE post SET title =?, body =?'
                ' WHERE id =?',
                (title, body, id)
            )
            db.commit()
            return redirect(url_for('blog.index'))

    return render_template('blog/update.html', post=post)

投稿の削除

最後に、著者が自分の投稿を削除できる機能を追加します。

## flaskr/blog.py

@bp.route('/<int:id>/delete', methods=('POST',))
@login_required
def delete(id):
    get_post(id)
    db = get_db()
    db.execute('DELETE FROM post WHERE id =?', (id,))
    db.commit()
    return redirect(url_for('blog.index'))

まとめ

おめでとうございます。Flask を使ってシンプルなブログアプリケーションを作成しました!このアプリケーションはユーザー認証をサポートしており、ユーザーが自分のブログ投稿を作成、編集、削除できるようになっています。