Flask-Security AttributeError:'NoneType'对象没有属性'filter_by'

问题描述 投票:0回答:2

我正在计算机网格仪表板上工作,几次遇到以下错误:

AttributeError: 'NoneType' object has no attribute 'filter_by'

这会在我稍微改变一下模型后发生。原始模型为:

class Worker (UserMixin, Base):

  __tablename__ = 'worker'

  ...

当它完全像这样时,我得到以下信息:

[2020-03-13 15:10:11,389] ERROR in app: Exception on /admin/ [GET]
Traceback (most recent call last):
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib64/python3.6/site-packages/flask_cors/extension.py", line 161, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib64/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 1947, in full_dispatch_request
    rv = self.preprocess_request()
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 2241, in preprocess_request
    rv = func()
  File "/home/rancher/.local/lib/python3.6/site-packages/flask_principal.py", line 477, in _on_before_request
    identity = loader()
  File "/home/rancher/.local/lib/python3.6/site-packages/flask_security/core.py", line 245, in _identity_loader
    if not isinstance(current_user._get_current_object(), AnonymousUserMixin):
  File "/home/rancher/.local/lib/python3.6/site-packages/werkzeug/local.py", line 307, in _get_current_object
    return self.__local()
  File "/usr/local/lib64/python3.6/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib64/python3.6/site-packages/flask_login/utils.py", line 335, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib64/python3.6/site-packages/flask_login/login_manager.py", line 359, in _load_user
    return self.reload_user()
  File "/usr/local/lib64/python3.6/site-packages/flask_login/login_manager.py", line 321, in reload_user
    user = self.user_callback(user_id)
  File "/home/rancher/.local/lib/python3.6/site-packages/flask_security/core.py", line 221, in _user_loader
    return _security.datastore.find_user(id=user_id)
  File "/home/rancher/.local/lib/python3.6/site-packages/flask_security/datastore.py", line 254, in find_user
    return self.user_model.query.filter_by(**kwargs).first()
AttributeError: type object 'Worker' has no attribute 'query'

[在Internet上寻找此错误,我得到的答案是它也应该从db.Model继承,即db = SQLAlchemy(app)。但是,一旦我需要从模型中将Worker导入到应用程序中,然后从应用程序中将db导入到模型中时,我将创建一个“导入循环”。这显然崩溃了。

我认为可行的解决方法是导入Model对象,例如

from flask_sqlalchemy import Model

并使我的模型继承自它

class Worker (Model, UserMixin, Base):
  ...

但最终我得到以下信息:

[2020-03-13 15:06:45,878] ERROR in app: Exception on /admin/ [GET]
Traceback (most recent call last):
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib64/python3.6/site-packages/flask_cors/extension.py", line 161, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib64/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 1947, in full_dispatch_request
    rv = self.preprocess_request()
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 2241, in preprocess_request
    rv = func()
  File "/home/rancher/.local/lib/python3.6/site-packages/flask_principal.py", line 477, in _on_before_request
    identity = loader()
  File "/home/rancher/.local/lib/python3.6/site-packages/flask_security/core.py", line 245, in _identity_loader
    if not isinstance(current_user._get_current_object(), AnonymousUserMixin):
  File "/home/rancher/.local/lib/python3.6/site-packages/werkzeug/local.py", line 307, in _get_current_object
    return self.__local()
  File "/usr/local/lib64/python3.6/site-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/local/lib64/python3.6/site-packages/flask_login/utils.py", line 335, in _get_user
    current_app.login_manager._load_user()
  File "/usr/local/lib64/python3.6/site-packages/flask_login/login_manager.py", line 359, in _load_user
    return self.reload_user()
  File "/usr/local/lib64/python3.6/site-packages/flask_login/login_manager.py", line 321, in reload_user
    user = self.user_callback(user_id)
  File "/home/rancher/.local/lib/python3.6/site-packages/flask_security/core.py", line 221, in _user_loader
    return _security.datastore.find_user(id=user_id)
  File "/home/rancher/.local/lib/python3.6/site-packages/flask_security/datastore.py", line 254, in find_user
    return self.user_model.query.filter_by(**kwargs).first()
AttributeError: 'NoneType' object has no attribute 'filter_by'

我该如何纠正?我对此很生气,不能再集中了

python flask flask-sqlalchemy flask-login flask-security
2个回答
0
投票
尝试使用

db = SQLAlchemy(app) class Worker(db.Model,UserMixin, Base): ...


0
投票
这有时也使我发疯。

在您的模型文件中:db = SQLAlchemy()

类Worker(db.Model,UserMixin)(不确定是什么基础)

然后在您的应用程序文件中:

从worker导入数据库

db.init_app(app)

© www.soinside.com 2019 - 2024. All rights reserved.