没有数据库的 Flask 登录

问题描述

我需要使用 flask-login 为我正在处理的应用程序之一实现简单的登录功能。身份验证检查是硬编码的 if 条件,它正在验证用户名密码是否等于给定的字符串。代码如下:

@auth_bp.route('/login',methods=["POST"])
def loginHandler():
    username = request.form.get('username')
    password = request.form.get('password')

    if username != 'admin' and password != 'Admin@123':
        flash('Please check your login details and try again.')
        return redirect(url_for('auth_bp.show_login'))

    login_user(username,False)
    # if the above check passes,then we kNow the user has the right credentials
    return redirect(url_for('migration_bp.list'))

app.py 文件中,我有以下代码

from flask import Flask
from flask_login import LoginManager,login_manager
from auth.auth import auth_bp
from environments.environments import environments_bp
from migration.migration import migration_bp
from logs.logs import logs_bp

UPLOAD_FOLDER = 'static/uploads'

@login_manager.user_loader
def user_loader():
    # since the user_id is just the primary key of our user table,use it in the query for the user
    return 1

def create_app():

    app = Flask(__name__)

    login_manager_copy = LoginManager()
    login_manager_copy.login_view = 'auth.login'
    login_manager_copy.init_app(app)

    app.register_blueprint(auth_bp,url_prefix='/auth')
    app.register_blueprint(environments_bp,url_prefix='/environments')
    app.register_blueprint(migration_bp,url_prefix='/migration')
    app.register_blueprint(logs_bp,url_prefix='/logs')

    app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
    app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

    return app


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

但这显示如下错误

AttributeError: module 'flask_login.login_manager' has no attribute 'user_loader'

由于我不需要数据库,我认为不需要示例中给出的用户模式。但是没有它它就会出错。我该如何解决这个问题?

编辑:

根据下面的建议,我添加一个 User 类,如下所示:

from flask_login import UserMixin,LoginManager,login_manager


class User(UserMixin):

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        return int(self.id)

    def __repr__(self):
        return f"User('{self.username}','{self.email}','{self.powerlevel}')"

并将以下代码添加app.py 文件中:

@login_manager.user_loader
    def load_user(user_id):
        # since the user_id is just the primary key of our user table,use it in the query for the user
        return User.query.get(int(user_id))

但它仍然显示相同的错误

解决方法

我很确定如果没有代表数据存储的类,Flask-Login 将无法工作,因为在某些时候它需要访问数据库以了解用户是否已经登录以及其他身份验证要求。

很明显,因为它没有强加存储限制,所以我认为你可以在没有数据库的情况下欺骗系统。

首先创建文档中指定的 User 类,https://flask-login.readthedocs.io/en/latest/

这样定义一个类 - 所有这些方法都是必需的。

class User:
    def is_authenticated():
        ...
    def is_active():
        ...
    def is_anonymous():
        ...
    def get_id():
        ...

创建一个属于该用户类型的全局变量并登录用户并执行其他任何操作。您不一定需要一个数据库,该类在其中表示信息。

如果您在评论中理解,请告诉我。乐于助人:)