Help us understand the problem. What is going on with this article?

Flask-Loginの使い方

More than 1 year has 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

@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
msrks
Computer Scienceと物理が好きです
http://msrks.github.io
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした