1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】簡易掲示板の作成(Flask)

Posted at

Python学習の取っ掛かりとして、以前にjavascriptの学習で作った簡易掲示板(投稿/表示/削除のみ)と全く同じものをPython,Flaskで作る。

Python基礎参考

簡易掲示板 コード全体 (app.py, index.html)
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>掲示板</title>
    <!-- Flask url_for関数 static:静的ファイル格納先 -->
    <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>

    <div>
        <h1>掲示板</h1>
        <!-- フォーム:投稿入力欄と投稿ボタン -->
        <form method="post" action="/">
            <textarea id="postInput" name="post_content" placeholder="ここに投稿内容を入力"></textarea>
            <button id="postButton" type="submit">投稿する</button>
        </form>

        <!-- 投稿リスト -->
        <ul id="posts">
            <!-- 投稿リストの各要素ループ -->
            {% for post in posts %}
            <!-- 投稿 -->
            <li class="post">
                {{ post['content'] }}<br>
                <!-- 投稿日時 -->
                <small>{{ post['timestamp'] }}</small>

                <!-- フォーム:投稿削除 -->
                <div class="button-side-container">
                    <form method="post" action="/">
                        <!-- 削除ボタン 削除する投稿のインデックスがvalueとして送信される -->
                        <button type="submit" name="delete_post" value="{{ loop.index0 }}" class="deleteButton">削除</button>
                    </form>
                </div>
            </li>            
            {% endfor %}
        </ul>
    </div>

</body>
</html>
app.py
# Flaskフレームワークと必要なモジュールをインポート
from flask import Flask, render_template, request
from datetime import datetime

# Flaskアプリケーションの作成
app = Flask(__name__)

# 投稿を格納するリスト
posts = []

# ルートパスへのGETとPOSTメソッドの処理を行う関数
@app.route('/', methods=['GET', 'POST'])
def index():
    # POSTメソッドでリクエストが送られた場合
    if request.method == 'POST':
        # フォームに'delete_post'が含まれていれば、投稿を削除
        if 'delete_post' in request.form:
            delete_index = int(request.form['delete_post'])
            delete_post(delete_index)
        else:
            # フォームから受け取った投稿内容を取得
            post_content = request.form['post_content']
            # 投稿内容が空でない場合、新しい投稿を追加
            if post_content.strip():
                posts.insert(0, {'content': post_content, 'timestamp': format_datetime()})
    
    # index.htmlテンプレートにpostsの内容を渡してレンダリング
    return render_template('index.html', posts=posts)

# 日時をフォーマットする関数
def format_datetime():
    now = datetime.now()
    return now.strftime("%Y/%m/%d %H:%M")

# 指定されたインデックスの投稿を削除する関数
def delete_post(index):
    if 0 <= index < len(posts):
        del posts[index]

# アプリケーションを実行
if __name__ == '__main__':
    app.run(debug=True)


1. import文、Flask

from flask import Flask, render_template, request
from datetime import datetime

# Flaskアプリケーションの作成
app = Flask(__name__)
  • from モジュール名 import 変数名・関数名
    import文 変数・関数名はコンマ区切り
    ※from flask import Flask (flask.FlaskクラスをFlaskという変数に代入)

  • app = Flask(__name__)
    Flaskクラスのインスタンスを作り、appという変数に代入。
    __name__ は、現在のPythonモジュールの名前を指す。

2. デコレータとルーティング

@app.route('/', methods=['GET', 'POST'])
def index():
    # ... 
  • @app.route('/', methods=['GET', 'POST'])
    次の行で定義される関数を指定したURLにマッピングする
    この場合GETとPOSTメソッドの双方を受け付ける。標準ではGETのみ

  • def index():
    def 関数名()
    関数の定義

3. リクエストの処理、条件分岐

if request.method == 'POST':
    # ... 
  • request.method
    HTTPリクエストのメソッドを取得(GET/POST)
  • if request.method == 'POST':
    リクエストがPOSTメソッドである場合

4. フォームからのデータ取得

post_content = request.form['post_content']
  • request.form['post_content']
    request.form フォームから送信されたデータが格納された辞書型オブジェクト
    そこから post_content という名前のデータを取得

5. 日時のフォーマット関数

def format_datetime():
    now = datetime.now()
    return now.strftime("%Y/%m/%d %H:%M")
  • datetime.now()
    現在の日時を取得
  • now.strftime("%Y/%m/%d %H:%M")
    取得した日時を指定されたフォーマットに変換

from datetime import datetime

6. 投稿の削除関数

def delete_post(index):
    if 0 <= index < len(posts):
        del posts[index]
  • if 0 <= index < len(posts):
    指定された indexpostsリストの範囲内にあるかどうかを確認。
  • del posts[index]
    postsリストから指定されたインデックスの要素を削除する。

7. Jinjaを使用したHTML生成

{% for post in posts %}
    # ... 
    {{ post['content'] }}
        {{ post['timestamp'] }}
    # ... 
{% endfor %}
  • {% for post in posts %} {% endfor %}
    Jinja2におけるループ構造、posts リスト内の各要素に対してループ処理を行う
  • {{ }} で囲まれた部分がJinjaテンプレートエンジンによって動的に生成される部分


実行・確認

python app.py

デフォルトでは http://127.0.0.1:5000/


その他参考

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?