Home > Back-end >  Flask session object does not persist between requests despite hardcoded secret key
Flask session object does not persist between requests despite hardcoded secret key

Time:11-11

I am currently running into an issue deploying a Flask app on Amazon's EB2 service. The Flask app works locally. When it is deployed, however, it only works for the first person who clicks the link. After that it throws the following error:

Internal Server Error The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.

The error it is throwing out concerns the Flask session - it becomes empty after routing from one site to another. I also noticed that the before_first_request function detailed below is ran only once, for the first user, and never again - which is even more bewildering.

Here's the minimal example:

from flask import Flask, render_template, request, session, url_for

application = Flask(__name__)
application.secret_key = "mysecretkey"

@application.before_first_request
def before_first_request():
    """ these commands are run before the first request"""

    # setup logging
    application.logger.setLevel(logging.INFO)
    application.logger.info('starting up Flask')

    # clear session
    session.clear()

    # load in PID
    session['pid'] = 123

    # add parameters to the session
    params = dict()
    params['parameter'] = 0
    session['params'] = params

    application.logger.info(session) # it is printing the session as expected
    return 'OK'


@application.route('/')
def main():
    """ landing page """
    application.logger.info(session) # empty
    application.logger.info(application.secret_key) # as expected
    params, results = session.pop('params'), session.pop('results') # throws out the error
    return render_template('empty_template.jinja', args = session)

I am wondering if anyone might know what is going on how to resolve the issue?

CodePudding user response:

I managed to solve it.

The error was that @before_first_request wrapper actually only ran once before first request ever made to the app. Hence, the session was actually only created and populated once.

I fixed that error by adding the call to before_first_request function at the top of the main function.

  • Related