はじめに
今回は前回の続きで、ユーザIDとパスワードを知っている人だけがアクセスできるようにユーザ認証の機能を実装する。そして、ナビゲーションバーにログイン、ログアウトのリンクを追加していく。
ログインフォームの作成
ログインフォームを作成する。
新しくtemplates以下にlogin.htmlというファイルを作る。
ファイルは下記のようになる。
<!doctype html>
<title>Flask Blog</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<div class="container">
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="/">Flask Blog</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav"
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="nav navbar-nav navbar-right">
<li class="nav-item">
<a class="nav-link" href="/login">ログイン</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/logout">ログアウト</a>
</li>
</ul>
</div>
</nav>
<div class="blog-body">
<form action="/login" method=post>
<div class="form-group">
<label for="InputTitle">ユーザ名</label>
<input type="text" class="form-control" id="InputTitle" name=username>
</div>
<div class="form-group">
<label for="InputPassword">パスワード</label>
<input type="password" class="form-control" id="InputPassword" name=password>
</div>
<button type="submit" class="btn btn-primary">ログイン</button>
</form>
</div>
</div>
<div class=”blog-body”></div>で囲まれた内容だけがindex.htmlと異なっている。この中身がログインフォームになる。
今回は、以下のようにformを作成する。
<div class="blog-body">
<form action="/login" method=post>
<div class="form-group">
<label for="InputTitle">ユーザ名</label>
<input type="text" class="form-control" id="InputTitle" name=username>
</div>
<div class="form-group">
<label for="InputPassword">パスワード</label>
<input type="password" class="form-control" id="InputPassword" name=password>
</div>
<button type="submit" class="btn btn-primary">ログイン</button>
</form>
input typeは入力されるデータの種類を指定する部分。ユーザ名は文字列なのでtext、パスワードはpasswordというタイプがあるのでこちらを指定します。これにより、フォームでは文字れるが入力可能になり、パスワードはマスクされて表示されるようになる。
nameは実際にフォームのデータがサーバに送られる際につけられる変数名。入力されたユーザ名はusernameという変数に、入力されたpasswordという変数に格納される。
<form action=”/login” method=post>は、http://127.0.0.1:5000/loginというURLに、POSTというHTTPリクエストメソッドでフォームに入力されたデータが送られるという意味である。
リンクをクリックするなどデータを読み込むとには、GET、データを送るときにはPOSTメソッドが使われルことが一般的。
ビューを作る -MTVフレームワークにおける View
これまで、ログイン(/login)、ログアウト(/logout)のリンクを設定。次に、このURLにリクエストがあった場合の処理を追加するために、views.pyファイルにビューを追加する。
ビューでは、ルーティング処理とそれに紐つく処理メソッドを記録する。
ルーティング処理とは、あるURLの対してリクエストがあった際、処理を特定をshow_entries()メソッドに紐つけていた。
ここでは同様に、/loginと/logoutについてもビュー追加する。
from flask import request, redirect, url_for, render_template, flash, session
from flask_blog import app
@app.route('/')
def show_entries():
return render_template('entries/index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
if request.form['username'] != app.config['USERNAME']:
print('ユーザ名が異なります')
elif request.form['password'] != app.config['PASSWORD']:
print('パスワードが異なります')
else:
return redirect('/')
return render_template('login.html')
@app.route('/logout')
def logout():
return redirect('/')
@app.route(‘/login’, methods=[‘GET’.’POST’])は、/loginというURLにリクエストがあったときのルーティング処理。methodsを指定することで、このURLに対するHTTPメソッドを指定することで、このURLに対するHTTPメソッドを制限することができます。指定しない場合はGETのみ許可される。
今回はloginリンクをクリックするときはGETメソッドが使われ、ログインフォームのデータ送信にはPOSTメソッドが使われルため、この2つを設定する。
次に、以下のように書くことで、POSTメソッドでリクエストがあったとき、つまり今回はログインフォームに入力されたデータが送られたときの処理を記載することができる。
if request.method == 'POST':
処理
今回の処理は、request.form[‘username]とrequest.form[‘password’]にそれぞれ入力されたユーザ名とパスワードが格納されているため、検証してみる。
正しい場合、/にリダイレクトさせ、そうでない場合はrender_template(‘login.html’)とログインを再度表示させるようにします。
GETメソッドの場合、つまり/loginをクリックしたときはこの処理を通らないので、render_template(‘login.html’)だけが実行され、ログインフォームが表示される。
@app.route(‘/logout’)はログアウトされた時の処理。ホーム画面に戻るようにしたいので/リダイレクトさせる。
configの追加
最後に、configに正しいユーザ名とパスワードを設定する。
DEBUG = True
USERNAME = 'yuji'
PASSWORD = 'yuji123'
これで、ログインフィームを作成することができた。
終わりに
今回は、ユーザIDとパスワードを知っている人だけがアクセスできるようにユーザ認証の機能を追加する。ナビゲーションバーにログイン、ログアウトのリンクを追加した。次回はレイアウトテンプレートを追加する。
コメント