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'
我正在使用 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'