属性错误:模块'flask_login.login_manager'在没有模式的情况下使用 Flask 登录时没有属性'user_loader'



我有以下代码,我正在尝试使用Flask进行身份验证:

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 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 True
def create_app():
app = Flask(__name__)
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"F4Q8znxec]/'
login_manager_copy = LoginManager()
login_manager_copy.login_view = 'auth.login'
login_manager_copy.init_app(app)
return app

我没有使用任何数据库,身份验证只是一个硬编码的if检查,因为这是用于一次性使用的内部工具。

如何修复此错误?

在应用程序工厂create_app()中创建LoginManager((对象之前,您正在装饰load_user函数

对于一个组织良好的应用程序,您应该将LoginManager配置为在应用程序工厂内使用您的应用程序。

def create_app():
app = Flask(__name__)
...
login_manager = LoginManager()
login_manager.init_app(app)
...
return app

然后在您的授权蓝图中,您访问应用程序对象代理current_app中的login_manager,并在那里定义load_user回调函数

from flask import current_app as app
...
...
@app.login_manager.userloader # Here your app is already created and configured with login manager
def load_user(_id):
#Get your user from the database or where ever you are storing your user information and construct the user object to return
if user_found:
return user
else:
return None
...
...

别忘了,他们还需要save_user函数,您可以调用该函数在成功登录时保存用户(您可以选择将其保存在DB或任何其他您认为合适的地方(。

现在,对于每个请求,都会调用此回调函数,它将重新加载您使用会话中存储的userID(例如cookie(保存的用户对象。如果它找到了一个具有相应ID的用户,它将根据load_user回调函数中的逻辑构建用户对象,并且您将拥有一个名为current_user的用户代理,您可以在请求的上下文中访问该代理

例如,在GET请求中,您可以执行

if current_user.age < 19:
raise Unauthorized("Too young to rent a car")

我强烈建议彻底阅读Flask登录文档,这样会更容易理解流程。

相关内容

最新更新