LoginSignup
41
44

More than 5 years have passed since last update.

flask-loginでログインページを実装したメモ

Last updated at Posted at 2019-01-20

flask-loginでシンプルなログインページを実装したメモです。

環境

項目 バージョン
Python 3.7
Flask 1.0.2
Flask-Login 0.4.1

ソース

今回は、Bootstrapの無料テンプレートを使ってログイン画面を実装しているのでexampleソースはGitHubに置いてあります。

Pythonコードは以下の通りです。

#!/usr/bin/env python3
from flask import Flask, request, Response, abort, render_template
from flask_login import LoginManager, login_user, logout_user, login_required, UserMixin
from collections import defaultdict

app = Flask(__name__)
login_manager = LoginManager()
login_manager.init_app(app)
app.config['SECRET_KEY'] = "secret"

class User(UserMixin):
    def __init__(self, id, name, password):
        self.id = id
        self.name = name
        self.password = password

# ログイン用ユーザー作成
users = {
    1: User(1, "user01", "password"),
    2: User(2, "user02", "password")
}

# ユーザーチェックに使用する辞書作成
nested_dict = lambda: defaultdict(nested_dict)
user_check = nested_dict()
for i in users.values():
    user_check[i.name]["password"] = i.password
    user_check[i.name]["id"] = i.id

@login_manager.user_loader
def load_user(user_id):
    return users.get(int(user_id))

@app.route('/')
def home():
    return Response("home: <a href='/login/'>Login</a> <a href='/protected/'>Protected</a> <a href='/logout/'>Logout</a>")

# ログインしないと表示されないパス
@app.route('/protected/')
@login_required
def protected():
    return Response('''
    protected<br />
    <a href="/logout/">logout</a>
    ''')

# ログインパス
@app.route('/login/', methods=["GET", "POST"])
def login():
    if(request.method == "POST"):
        # ユーザーチェック
        if(request.form["username"] in user_check and request.form["password"] == user_check[request.form["username"]]["password"]):
            # ユーザーが存在した場合はログイン
            login_user(users.get(user_check[request.form["username"]]["id"]))
            return Response('''
            login success!<br />
            <a href="/protected/">protected</a><br />
            <a href="/logout/">logout</a>
            ''')
        else:
            return abort(401)
    else:
        return render_template("login.html")

# ログアウトパス
@app.route('/logout/')
@login_required
def logout():
    logout_user()
    return Response('''
    logout success!<br />
    <a href="/login/">login</a>
    ''')

if __name__ == '__main__':
    app.run(host="0.0.0.0",port=8080,debug=True)

今回はDBと連携しないのでコードの中にログインするユーザーを書いています。

動かし方

pipで flask-login をインストールします。
シェバングは環境に合わせて変更してください

$ pip install flask-login
$ git clone https://github.com/sky-joker/flask-login-example.git
$ cd flask-login-example
$ chmod +x app.py
$ ./app.py

動作例

まずは、ログインしていない状態で /protected/ へアクセスして拒否されることを確認しています。
その後にログインしてから再度アクセスして問題なくアクセスできていることを確認します。

flask-login-example.gif.gif

参考文献

41
44
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
41
44