ダイアログフロー フルフィルメント フラスコ パッケージを使用して、単純なチャットボットを構築しています。以前に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)
私は次の方法を試しました:
- フラスコセッションパッケージを削除し、組み込みのフラスコセッションを使用しましたが、成功しませんでした。
- セッションをテストするために簡単なルートを設定しましたが、問題なく動作していました。ただし、ハンドラー関数内では機能しません。
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
何が起こっているのかわかりませんか?どんな助けでも大歓迎です!