Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
OrganizationEventAdvent CalendarQiitadon (β)
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

More than 3 years have passed since last update.



Flask-Login: ユーザー認証を簡単に扱うためのFlask拡張

$ pip install flask-login


1. login/logoutが login_user(user)/logout_user()で簡単に管理できる

from flask_login import login_user, logout_user

def login():
    if valid():
        return redirect(request.args.get('next') or url_for('index'))

def logout():

2. ログインが必要なページを @login_requiredデコレーターで簡単に管理できる

from flask_login import 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.login_view = "users.login" # login_viewのrouteを設定

2. UserMixinを継承した Userクラスを作る

from flask_login import UserMixin

class User(UserMixin, db.Model)

3. @login_manager.user_loaderで認証ユーザーの呼び出し方を定義する

def load_user(user_id):
    return User.get(user_id)

4. 認証したいページに @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 %}

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オブジェクトがセットされ、いい感じに使える


  • is_active, is_authenticated == False
  • is_anonymous == True
  • get_id() returns None
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Help us understand the problem. What is going on with this article?