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

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

More than 3 years have passed since last update.

@msrks

Flask-Loginの使い方

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
104
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
104
Help us understand the problem. What is going on with this article?