查询不存在的键时,Flask-SQLAlchemy query.get()会引发异常

时间:2016-05-18 13:01:09

标签: python mysql flask sqlalchemy

我正在构建一个需要管理用户登录和会话的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()对象的文件。

1 个答案:

答案 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。