コンテンツにスキップ

第7章 ログイン

1 app.py(フォーム表示)

ログイン用のページを作成します。

@app.get('/login')
def login():
    return render_template("login.html")

/login にアクセスし、ログインページが表示されることを確認します。

2 login.tml

login.htmlにはログイン用のフォームを作成します。まず、エラーメッセージを出す部分を作成します。これはフラッシュメッセージと言って、flash関数で設定したメッセージを取得するものです。一度だけ表示されるのが特徴です。

{% for message in get_flashed_messages() %}
    <p>{{ message }}</p>
{% endfor %}

その下にフォームを作成します。フォームは、/loginにPOSTで送信します。テキストボックスはplaceholderを使って何を入力するかを表示しています。

<form action="/login" method="post" >
<input type="text" name="uname" placeholder="ユーザ名" required><br>
<input type="password" name="upass" placeholder="パスワード" required><br>
<input type="submit" value="ログイン">
</form>

3 app.py(ログイン処理)

app.py で送信データを受け取る関数、login_postを作成します。unameとupassを受け取り、userテーブルをfilterで検索します。検索結果は一件のはずなので、first() で結果を受け取ります。

結果がNoneの場合、ログインに失敗していますので、flash関数でエラーメッセージを設定して、/loginにリダイレクトします。 そうで無い場合にはログインに成功していますので、ユーザIDをセッションに保存し、トップページにリダイレクトします。

@app.post('/login')
def login_post():
    uname = request.form['uname']
    upass = request.form['upass']

    row = User.query.filter(User.uname==uname, User.upass == upass).first()

    if row is None:
        flash("ユーザ名またはパスワードが違います")
        return redirect("/login")
    else:
        session['uid'] = row.uid
        return redirect("/")

セッションはsessionという名前の辞書で表されます。この辞書に入れた内容はページをまたいでも引き継がれます。ただし、大きなデータは入れることは出来ません。そこで、ログインしたユーザのIDのみを保存しています。

4 style.css

staticフォルダにあるstyle.cssにスタイルを設定します。 テキストボックス、パスワードは内側に余白を0.5文字、角を丸くして外側にライトグレイの線を引きます。幅は20文字とし、下側に余白を取ります。

input[type="text"], input[type="password"] {
    padding: 0.5em;
    border: 1px solid lightgray;
    border-radius: 4px;
    width: 20em;
    margin-bottom:0.5em;
}

ログインボタンは背景色を緑にし文字を白にします。もともとあった枠線は消します。ボタンの内側に余白を付けて少しボタンを大きくします。角を丸くし、マウスカーソルが上に来たときに形を変更します。

input[type="submit"] {
    background-color: #4CAF50;
    color: white;
    border: none;
    padding: 0.5em 1em;
    border-radius: 4px;
    cursor: pointer;
}