用户登录组件Flask-Login

文档:

简要说明

flask_login提供的方法

# 类
UserMixin     用户类

#方法
login_user()  用户登入
logout_user() 登出功能

# 变量
current_user  获取当前用户

# 装饰器
@login_required 访问限制

基本的接口


# 1、实例化登录管理对象
login_manager = LoginManager(app)


# 2、编写用户类
class User(UserMixin):
    pass


# 3、加载用户, login_required 需要查询用户信息
@login_manager.user_loader
def user_loader(user_id: str):
    """
    [注意] 这里的user_id类型是str
    """
    return User()


# 4、登录
@app.route('/login', methods=['GET', 'POST'])
def login():
    login_user(User())


# 5、登出功能实现
@app.route('/logout')
@login_required
def logout():
    logout_user(User())


# 6、访问控制
@app.route('/')
@login_required
def index():
    pass

使用示例

app.py

from flask import Flask, request, flash, render_template, redirect, url_for
from flask_login import UserMixin, LoginManager, login_required, logout_user, login_user, current_user

# 创建 Flask 应用
app = Flask(__name__)

app.secret_key = 'secret_key'  # 设置表单交互密钥


# 模拟数据库查询
class UserService:
    users = [
        {'id': 1, 'username': 'tom', 'password': '1'},
        {'id': 2, 'username': 'jack', 'password': '2'}
    ]

    @classmethod
    def query_user_by_name(cls, username):
        for user in cls.users:
            if username == user['username']:
                return user

    @classmethod
    def query_user_by_id(cls, user_id):
        for user in cls.users:
            if user_id == user['id']:
                return user


# 1、实例化登录管理对象
login_manager = LoginManager()

# 参数配置
login_manager.login_view = 'login'
login_manager.login_message_category = 'info'
login_manager.login_message = 'Access denied.'

login_manager.init_app(app)  # 初始化应用


# 2、编写用户类
class User(UserMixin):
    pass


# 3、加载用户, login_required 需要查询用户信息
@login_manager.user_loader
def user_loader(user_id: str):
    """
    [注意] 这里的user_id类型是str
    :param user_id:
    :return:
    """
    if UserService.query_user_by_id(int(user_id)) is not None:
        curr_user = User()
        curr_user.id = user_id
        return curr_user


# 4、登录
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':

        username = request.form.get('username')
        user = UserService.query_user_by_name(username)

        if user is not None and request.form['password'] == user['password']:
            curr_user = User()
            curr_user.id = user['id']

            # 通过Flask-Login的login_user方法登录用户
            login_user(curr_user)

            # 登录成功后重定向
            next_url = request.args.get('next')
            return redirect(next_url or url_for('index'))

        flash('Wrong username or password!')

    else:
        # GET 请求
        return render_template('login.html')


# 5、登出功能实现
@app.route('/logout')
@login_required
def logout():
    # 通过Flask-Login的logout_user方法登出用户
    logout_user()
    return 'Logged out successfully!'


# 6、访问控制
@app.route('/')
@login_required
def index():
    return 'index: ' + current_user.get_id()


if __name__ == '__main__':
    app.run(debug=True)

视图文件 templates/login.html

<!DOCTYPE html>
<title>Login</title>
<h1>Login</h1>

{% with messages = get_flashed_messages() %}
    <div>{{ messages[0] }}</div>
{% endwith %}

<form action="{{ url_for('login') }}" method="POST">
    <p><input type="text" name="username" id="username" placeholder="Username"/></p>
    <p><input type="password" name="password" id="password" placeholder="Password"/></p>
    <p><input type="submit" name="submit"/></p>
</form>

参考
Flask-Login 让实现登录功能变简单
第57天: Flask 用户登录 Flask-Login