AttributeError: Object has no attribute 'user_loader'

AttributeError: Object has no attribute 'user_loader'

我正在使用 Flask 框架编写带有身份验证的网站。我已经尝试了在互联网上找到的所有解决方案,但对我没有任何帮助。

我的第一个想法是,项目结构已损坏。例如缺少来自其他文件的导入。但我认为这不是问题。

我的models.py文件:

from flask_login import UserMixin, LoginManager
from flaskapp import db, login_manager




@login_manager.user_loader
def get_user(user):
    try:
        return get_id(user)
    except:
        return None


class User(db.Model,UserMixin):
    id          =db.Column(db.Integer, primary_key=True)
    username    =db.Column(db.String(20),unique=True, nullable=False)
    email       =db.Column(db.String(120), unique=True, nullable=False)
    password    =db.Column(db.String(60), nullable=False)
    powerlevel  =db.Column(db.Integer, nullable=False)

    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}')"

我的init.py文件:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager


app = Flask(__name__)
app.config['SECRET_KEY'] = 'xxx'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)
bcrypt = Bcrypt(app)


login_manager = LoginManager(app)
login_manager.login_view = 'login'
login_manager = login_message_category = 'info'




from flaskapp import routes

当 运行使用 WebApp 时:

导出 FLASK_APP=run.py DEBUG=TRUE 烧瓶 运行

出现以下错误消息:

Traceback (most recent call last):
  File "/home/osboxes/.local/bin/flask", line 11, in <module>
    sys.exit(main())
  File "/home/osboxes/.local/lib/python3.6/site-packages/flask/cli.py", line 966, in main
    cli.main(prog_name="python -m flask" if as_module else None)
  File "/home/osboxes/.local/lib/python3.6/site-packages/flask/cli.py", line 586, in main
    return super(FlaskGroup, self).main(*args, **kwargs)
  File "/home/osboxes/.local/lib/python3.6/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/home/osboxes/.local/lib/python3.6/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/osboxes/.local/lib/python3.6/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/osboxes/.local/lib/python3.6/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/home/osboxes/.local/lib/python3.6/site-packages/click/decorators.py", line 64, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
  File "/home/osboxes/.local/lib/python3.6/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/home/osboxes/.local/lib/python3.6/site-packages/flask/cli.py", line 848, in run_command
    app = DispatchingApp(info.load_app, use_eager_loading=eager_loading)
  File "/home/osboxes/.local/lib/python3.6/site-packages/flask/cli.py", line 305, in __init__
    self._load_unlocked()
  File "/home/osboxes/.local/lib/python3.6/site-packages/flask/cli.py", line 330, in _load_unlocked
    self._app = rv = self.loader()
  File "/home/osboxes/.local/lib/python3.6/site-packages/flask/cli.py", line 388, in load_app
    app = locate_app(self, import_name, name)
  File "/home/osboxes/.local/lib/python3.6/site-packages/flask/cli.py", line 240, in locate_app
    __import__(module_name)
  File "/home/osboxes/Desktop/HMI/run.py", line 1, in <module>
    from flaskapp import app
  File "/home/osboxes/Desktop/HMI/flaskapp/__init__.py", line 21, in <module>
    from flaskapp import routes
  File "/home/osboxes/Desktop/HMI/flaskapp/routes.py", line 6, in <module>
    from flaskapp.models import User
  File "/home/osboxes/Desktop/HMI/flaskapp/models.py", line 7, in <module>
    @login_manager.user_loader
AttributeError: 'str' object has no attribute 'user_loader'

现在我不知道还有什么问题。 如果我忘记提供一些代码来解决错误,请告诉我。 感谢您的帮助!

您已经使用了 login_manager = LoginManager(app) 您正在创建的对象以及配置。 Insider of that first create an object and configure the object in 2 steps.

login_manager = LoginManager()

login_manager.init_app(app)

如需更多参考,请在此处查看 link[https://flask-login.readthedocs.io/en/latest/]

您可能需要更新 init.py 文件。

首先,您的 User.get_id 应该返回 unicode 而不是 int。文档提到了这一点,以及一个例子:

This method must return a unicode that uniquely identifies this user, and can be used to load the user from the user_loader callback. Note that this must be a unicode - if the ID is natively an int or some other type, you will need to convert it to unicode. (Your User Class)

因此需要更改为:

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

接下来是您的 user_loader。来自文档:

This sets the callback for reloading a user from the session. The function you set should take a user ID (a unicode) and return a user object, or None if the user does not exist.

这意味着将您的 user_loader 调整为:

@login_manager.user_loader
def get_user(user_id):
    try:
        return User.query.get(int(user_id))
    except:
        return None

另外,你这里有错误,很可能是错误的直接原因:

login_manager = login_message_category = 'info'

因此,您将 login_manager 替换为内容为 'info' 的字符串。所以稍后当您的应用程序尝试访问 login_manager.user_loader 时失败了,因为字符串 'info' 没有 user_loader 方法。

将其更改为以下应该可以修复错误。尽管上述其他问题也需要实施。

login_manager.login_message_category = 'info'