LoginSignup
122
117

More than 5 years have passed since last update.

Flask-Loginの使い方

Last updated at Posted at 2017-09-28

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. ログイン処理を実装する。

  1. パスワードがあっていれば login_user(user, bool_remenber_me)でログイン済みユーザーとして記録する。
  2. login_managerが 次に行くべきページを next queryとして保存しているので、そこにリダイレクトする。
  3. 逆に 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_userAnonymousUserMixinオブジェクトがセットされ、いい感じに使える

AnonymousUserMixinオブジェクトは以下の特徴を持つ。

  • is_active, is_authenticated == False
  • is_anonymous == True
  • get_id() returns None
122
117
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
122
117