0

ダイアログフロー フルフィルメント フラスコ パッケージを使用して、単純なチャットボットを構築しています。以前にget_Name_ID(agent )ハンドラーで設定したdef goalName(agent)ハンドラーのセッション変数にアクセスしようとすると、Heroku ログから重要なエラー メッセージが表示されます。

ここに私が使用しているWebhookがあります:

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



2 番目のハンドラ関数は次のとおりです。

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. セッションをテストするために簡単なルートを設定しましたが、問題なく動作していました。ただし、ハンドラー関数内では機能しません。

2 番目のハンドラーからセッション データにアクセスすると、キー エラーが発生します。

_ 2021-08-05T10:47:48.928371+00:00 app[web.1]: super()を返す。getitem (キー) 2021-08-05T10:47:48.928372+00:00 app[web.1]: KeyError: 'u_id

何が起こっているのかわかりませんか?どんな助けでも大歓迎です!

4

1 に答える 1