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):
指定されたindex
がposts
リストの範囲内にあるかどうかを確認。 -
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/
その他参考