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

Wil*_*oll 2 python mysql sqlalchemy flask

我正在构建一个Flask应用程序,该应用程序需要管理用户登录名和会话。尝试验证用户会话时遇到了一个异常错误。我使用Flask会话存储用户的当前sessionId,然后应用程序使用sessionId从数据库的会话表中查找当前会话。

这是生成错误的代码:

session_id = flask.session.get("session_id", "")
session = models.Session.Session.query.get(session_id)
Run Code Online (Sandbox Code Playgroud)

这是我从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()
Run Code Online (Sandbox Code Playgroud)

看起来,当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())
Run Code Online (Sandbox Code Playgroud)

编辑完整: 我的目录结构在这里链接。run.py是创建和运行Flask()对象的文件。

Fil*_*ral 6

当您None作为get()方法的参数传递时,会发生该错误。您可以在查询之前验证session_id变量是否不为None

if session_id is not None:
    session = models.Session.Session.query.get(session_id)
else:
    # do something
Run Code Online (Sandbox Code Playgroud)

或者您可以将filter_by()method与first()method 结合使用:

session = models.Session.Session.query.filter_by(sessionId=session_id).first()
Run Code Online (Sandbox Code Playgroud)

如果找不到,它将返回None。