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