【问题标题】:Flask-Security AttributeError: 'NoneType' object has no attribute 'filter_by'Flask-Security AttributeError:“NoneType”对象没有属性“filter_by”
【发布时间】:2020-06-25 18:19:42
【问题描述】:

我正在使用计算机网格仪表板并多次遇到以下错误:

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'

在网上找这个错误,我得到的答案是它也应该继承自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


    【解决方案1】:

    这有时也让我发疯。

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

    class Worker(db.Model, UserMixin)(不确定 Base 是什么)

    然后在你的应用文件中:

    从工人导入数据库

    db.init_app(app)

    【讨论】:

    • 这似乎工作得很好,但现在我面临另一个问题:sh sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'roles_workers.role_id' could not find table 'role' with which to generate a foreign key to target column 'id'
    【解决方案2】:

    尝试使用

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

    【讨论】:

    • 就是这样。 appWorker 在不同的文件中
    • 你需要导入它。
    • 我不认为你真的明白。如果我在两个文件上都导入它,它会创建一个导入循环
    猜你喜欢
    • 1970-01-01
    • 2014-12-29
    • 2021-12-26
    • 1970-01-01
    • 2022-11-28
    • 2017-04-26
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多