python - Flask-SQLAlchemy query.get() 在查询不存在的键时抛出异常

标签 python mysql flask sqlalchemy

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

这是产生错误的代码:

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 文档声明它应该返回 在这种情况下。

作为引用,这里是我的 session 模型的代码:

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() 对象的文件。

最佳答案

当您将 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。

关于python - Flask-SQLAlchemy query.get() 在查询不存在的键时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37300417/

相关文章:

python - 仅执行的用户权限

mysql - 查询中函数的 IN 运算符的替代或替换 IN 运算符?

python - 蓝图和工厂模式一起工作?

python - Flask-marshmallow - 如何有条件地生成 HATEOAS URL

python - 我如何惰性初始化 SQLAlchemy

python - Python中的迷你语言

python - 散点图的最佳拟合线

Python列表弹出

Mysql-如何根据条件将不同列的值显示到同一行

MySQL:如何更新以 "1"开头的键列