首页 > 解决方案 > 尝试从另一个处理程序函数访问烧瓶会话数据时出现关键错误

问题描述

我正在使用 dialogflow 实现烧瓶包来构建一个简单的聊天机器人。当我尝试访问之前在get_Name_ID(agent)处理程序中设置的def goalName(agent)处理程序中的会话变量时,我从 Heroku 日志中收到一条关键错误消息。

这是我正在使用的网络钩子:

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

这是第一个处理函数

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



这是第二个处理函数:

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

我以以下方式设置了烧瓶会话:

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) 

我尝试了以下方法:

  1. 删除烧瓶会话包并使用内置烧瓶会话但没有成功。
  2. 我已经设置了简单的路线来测试会话,并且工作正常。但它无法在处理程序函数中工作。

从第二个处理程序访问会话数据时出现关键错误:

_ 2021-08-05T10:47:48.928371+00:00 应用程序 [web.1]:返回 super()。getitem (key) 2021-08-05T10:47:48.928372+00:00 app[web.1]: KeyError: 'u_id

我不确定发生了什么?任何帮助将非常感激!

标签: pythonflaskflask-session

解决方案


您可以使用 redis 服务器进行会话。它会解决你的问题


推荐阅读