问题描述
我需要使用 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'))
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'
由于我不需要数据库,我认为不需要示例中给出的用户模式。但是没有它它就会出错。我该如何解决这个问题?
编辑:
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}')"
@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():
...
创建一个属于该用户类型的全局变量并登录用户并执行其他任何操作。您不一定需要一个数据库,该类在其中表示信息。
如果您在评论中理解,请告诉我。乐于助人:)