Flask-Login: ユーザー認証を簡単に扱うためのFlask拡張
インストール
$ pip install flask-login
主な機能
1. login/logoutが login_user(user)
/logout_user()
で簡単に管理できる
from flask_login import login_user, logout_user
@app.route('/login')
def login():
if valid():
login_user(user)
return redirect(request.args.get('next') or url_for('index'))
@app.route('/logout')
def logout():
logout_user()
2. ログインが必要なページを @login_required
デコレーターで簡単に管理できる
from flask_login import login_required
@app.route('/protected')
@login_required
def protected():
return 'Logged in as: ' + current_user.id
使い方
1. LoginManager
インスタンスを作り、init_app(app)
する
import flask
app = flask.Flask(__name__)
app.secret_key = 'super secret string' # Change this!
from flask_login import LoginManager
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "users.login" # login_viewのrouteを設定
2. UserMixin
を継承した Userクラスを作る
from flask_login import UserMixin
class User(UserMixin, db.Model)
pass
3. @login_manager.user_loader
で認証ユーザーの呼び出し方を定義する
@login_manager.user_loader
def load_user(user_id):
return User.get(user_id)
4. 認証したいページに @login_required
デコレートする
@app.route("/secret")
@login_required
def secret():
return "secret contents"
5. ログインページのViewをつくる
テンプレートから current_userという変数が使えるようになる。is_authenticated()メソッドでログインの有無を確認できるので便利。
<ul class "nav navbar-nav navbar-right">
{% if current_user.is_authenticated() %}
<li><a href="{{ url_for('auth.logout') }}">Sign Out</a></li>
{% else %}
<li><a href=v{{ url_for('auth.login') }}">Sign In</a></li>
{% endif %}
</ul>
6. ログイン処理を実装する。
- パスワードがあっていれば login_user(user, bool_remenber_me)でログイン済みユーザーとして記録する。
- login_managerが 次に行くべきページを next queryとして保存しているので、そこにリダイレクトする。
- 逆に logout_user() で現在のユーザーをログアウトさせることができる
from flask import render_template, redirect, request, url_for, flash
from flask_login import login_user
from . import auth
from ..models import User
from .forms import LoginForm
@auth.route("/login", methods=["GET", "POST"])
def login():
form = LoginForm()
if form.validate_on_submit():
if VALID:
login_user(user, form.remenber_me.data)
return redirect(request.args.get("next") or url_for("main.index")
そのたの有用機能
1. cookieを使った remember me が簡単に実装できる
login_user(user, form.remember_me.data)
2. グローバル変数current_user
がスクリプトからもテンプレートからも使える
{% if current_user.is_authenticated %}
Hi {{ current_user.name }}!
{% endif %}
3. ログインしてない時はcurrent_user
にAnonymousUserMixin
オブジェクトがセットされ、いい感じに使える
AnonymousUserMixin
オブジェクトは以下の特徴を持つ。
- is_active, is_authenticated == False
- is_anonymous == True
- get_id() returns None