我正在计算机网格仪表板上工作,几次遇到以下错误:
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'
我该如何纠正?我对此很生气,不能再集中了
db = SQLAlchemy(app)
class Worker(db.Model,UserMixin, Base):
...
在您的模型文件中:db = SQLAlchemy()
类Worker(db.Model,UserMixin)(不确定是什么基础)
然后在您的应用程序文件中:
从worker导入数据库
db.init_app(app)