我正在构建一个需要管理用户登录和会话的Flask应用程序。尝试验证用户的会话时,我遇到了一个异常错误。我使用Flask会话来存储用户的当前sessionId,然后应用程序使用sessionId从数据库中的会话表中查找当前会话。
这是产生错误的代码:
session_id = flask.session.get("session_id", "")
session = models.Session.Session.query.get(session_id)
这是我从SQLAlchemy得到的错误:
File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/gunicorn/PROJECTNAME/routes.py", line 24, in index
return controllers.index.indexController()
File "/home/gunicorn/PROJECTNAME/controllers/index.py", line 17, in indexController
session = models.Session.Session.query.get(session_id)
File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/sqlalchemy/orm/query.py", line 831, in get
return self._get_impl(ident, loading.load_on_ident)
File "/home/gunicorn/PROJECTNAME/PROJECTNAMEenv/lib/python3.4/site-packages/sqlalchemy/orm/query.py", line 842, in _get_impl
if len(ident) != len(mapper.primary_key):
TypeError: object of type 'NoneType' has no len()
当为表中不存在的索引运行query.get()
时,会抛出此错误,但Flask-SQLAlchemy的API文档声明它应该返回此None
情况下。
供参考,以下是我的会话模型的代码:
class Session(db.Model):
sessionId = db.Column(db.String(32), primary_key=True)
userId = db.Column(db.Integer, db.ForeignKey('user.userId'), nullable=False)
createdOn = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now())
编辑完整性: 我的目录结构已链接here。 run.py是创建并运行Flask()对象的文件。
答案 0 :(得分:6)
当您将None
作为get()
方法的参数传递时,会发生该错误。您可以在查询之前验证session_id变量是否为None
if session_id is not None:
session = models.Session.Session.query.get(session_id)
else:
# do something
或者您可以将filter_by()
方法与first()
方法结合使用:
session = models.Session.Session.query.filter_by(sessionId=session_id).first()
如果没有找到,它将返回None。