Docker Desktop (003_FlaskでPost, Get)

■もう少しFlaskを使ってみる。
前回はただHello Worldを表示させただけなので、もう少しFlaskを使う。サーバ側へデータを送り、Sessionを使って別ページへそのデータを持っていくことを見てみる。
具体的なコードは下のもの。FlaskのサイトのQuick Startを参考にしながら少し修正した。

from flask import Flask, session, request, redirect, url_for

app = Flask(__name__)
app.secret_key = b'1234567890abc'


@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        request.form['logoutButton']
        return redirect(url_for('logout'))
    else:
        if 'username' in session:
            return f'Logged in as {session["username"]} ' + '''
                <form method="post">
                <p>Logout:
                <button type="submit" name="logoutButton">Logout</button>
                </form>
            '''
        else:
            return redirect(url_for('login'))

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('index'))
    return '''
        <form method="post">
            <p>Input your name
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
    '''


@app.route('/logout')
def logout():
    # remove the username from the session if it's there
    session.pop('username', None)
    return redirect(url_for('index'))

まず起動すると、def indexから入り、sessionにデータがないため、def loginへリダイレクトされる。

テキストボックス内に、名前を入れ(ここではTaro)、Loginボタンを押すと、def indexにリダイレクトされる。今度は、sessionにデータがあるため、def indexが表示される。

Logoutボタンを押すと、postのリクエストになるため、def logoutへリダイレクトされ、sessionの中身が削除されたのち、さらにdef loginにリダイレクトされる。

上の処理を行った際に、PycharmのTerminal部分には下の表示となる。

ここで302, 404, 200といった数値は、HTTPのステータスコードだと思う。それぞれの処理はおそらく下のような感じ。
1.起動した際に、def index → def login へリダイレクト(302)
2.def login の表示成功 (200)
3.アイコン(favicon.ico)の設定はしていないため、データが見つからない (404)
4.def loginへ名前を入れて送信 def login → def index へリダイレクト (POST, 302)
5.def index の表示成功 (200)
6.ログアウトの送信 def index → def logout へリダイレクト (POST, 302)
7.def logout → def index へリダイレクト (302)
8.def index → def login へリダイレクト (302)
9.def login の表示成功 (200)

もう少しif, else文を使うところと@app.routeを使うところをうまく切り分ければリダイレクトを少なくできるかもしれない。