Tahir Abbas
Tahir Abbas

Reputation: 11

I am getting key error when trying to access flask session data from another handler function

I am using dialogflow fulfillment flask package to build a simple chatbot. When I try to access the session variable in the def goalName(agent) handler that I set previously in the get_Name_ID(agent) handler, I get a key error message from the Heroku logs.

here is the webhook I am using:

@app.route('/webhook', methods=['POST', 'GET'])
def webhook() -> Dict:
  
    """Handle webhook requests from Dialogflow."""
    # Get WebhookRequest object
    request_ = request.get_json(force=True)

    # Log request headers and body
    logger.info(f'Request headers: {dict(request.headers)}')
    logger.info(f'Request body: {request_}')

    # Handle request
    agent = WebhookClient(request_)

    action = request_.get('queryResult').get('action')

    if action  == "get.secret.key":
        agent.handle_request(get_Name_ID)

    if action  == "goal.setting.name":
        agent.handle_request(goalName)

here is the first handler function

def get_Name_ID(agent):

    task = TASK.query.filter_by(status="active").first()

    if not USER.query.filter_by(passcode = agent.parameters["id"]).first():
        user = USER(agent.parameters["id"], agent.parameters["name"])
        db.session.add(user)
        db.session.commit()


    # store variables into session for later usage
    key = id_generator()
    user_session = SESSION(task.id, key)
    db.session.add(user_session)
    db.session.flush()

    # store values to session
    session['s_id'] = user_session.id
    session['u_id'] = agent.parameters["id"]
    session['user_name'] = agent.parameters["name"]

    db.session.commit()



here is the second handler function:

def goalName(agent):
   
    task = TASK.query.filter_by(status="active").first()
    # print(type(redish.get('u_id')))
    # print(redish.get('u_id'))

    # get values from session
    uid  = session['u_id']
    sid  = session['s_id']

    goal = GOAL(uid, task.id, sid, agent.parameters["goalName"], "", "", "", "", "")
    db.session.add(goal)
    db.session.flush()
    session['goal_id'] = goal.id
    db.session.commit()

I have setup the flask-session in the following manner:

app.config['SECRET_KEY'] = os.getenv('SECRET_KEY') or \
    'e5ac358c-f0bf-11e5-9e39-d3b532c10a28'

app.config['SESSION_TYPE'] = 'sqlalchemy'

db = SQLAlchemy(app)

app.config['SESSION_SQLALCHEMY'] = db

sess = Session(app) 

I have tried the following methods:

  1. removing the flask-session package and using built-in flask session but with no success.
  2. I have set up simple routes to test the session and it was working fine. But it fails to work within the handler functions.

I am getting the key error when accessing session data from the second handler:

_ 2021-08-05T10:47:48.928371+00:00 app[web.1]: return super().getitem(key) 2021-08-05T10:47:48.928372+00:00 app[web.1]: KeyError: 'u_id

I am not sure what is going on? Any help would be much appreciated!

Upvotes: 0

Views: 312

Answers (1)

Fauzan khan
Fauzan khan

Reputation: 57

You can use redis server for session. It Will be solved your issue

Upvotes: 0

Related Questions