2

I am building a Flask app that needs to manage user logins and sessions. I have run into an unusual error when attempting to validate a user's session. I use Flask sessions to store the user's current sessionId, then the application uses the sessionId to look up the current session from a sessions table in the database.

This is the code generating the error:

session_id = flask.session.get("session_id", "")
session = models.Session.Session.query.get(session_id)

This is the error I get from 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()

It appears that when query.get() is run for an index that does not exist in the table, this error is thrown, though the API docs for Flask-SQLAlchemy state that it should return None in this case.

For reference, here is the code for my Session model:

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())

EDIT FOR COMPLETENESS: My directory structure is linked here. run.py is the file where the Flask() object is created and run.

1 Answer 1

6

That error happens when you pass None as parameter of get() method. You can verify if session_id variable is not None before querying

if session_id is not None:
    session = models.Session.Session.query.get(session_id)
else:
    # do something

or you can use the filter_by() method in conjunction with first() method:

session = models.Session.Session.query.filter_by(sessionId=session_id).first()

it will return None if not was found.

Sign up to request clarification or add additional context in comments.

5 Comments

I'm fairly sure it is correct the way I have it. My directory structure has models as a package with the file Session.py in it, and there is a class Session defined within Session.py.
Can you give more details about the implementation? See How to create a Minimal, Complete, and Verifiable example
No problem! I just edited in an image of the directory structure of the project.
Sorry, I was misunderstanding your problem. I have edited my answer.
Thank you, I decided to use the second solution.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.