首页 > 解决方案 > 无法为谷歌上的各种操作检索 Flask 会话变量

问题描述

我正在使用 Dialogflow 接收用户输入,并使用 webhook 调用将接收到的值传递给烧瓶程序。在 webhook 调用上为此操作设置会话变量。对于另一个谷歌操作,我正在尝试检索会话变量。但是,我无法访问它们。让我知道我哪里出错了。提前致谢。

DialogFlow Intent - setclass 从 User 接收参数 'class' (grade) 并调用 Action setclass,通过 webhook 调用设置会话变量 class 和grade。

Dialogflow Intent - getclass Action getclass 通过 webhook 调用获取会话中设置的值。

用于存储和接收会话值的 Flask 程序:

from flask import Flask, request, session, jsonify

app = Flask(__name__)
app.secret_key = "abc"

@app.route("/sessiontrial",methods=['POST','GET'])
def sessiontrial():
    req = request.get_json(silent=True, force=True)
    value = req.get('queryResult')
    params = value.get('parameters') 
    action = value.get('action')
    
    print("Inside sessiontrial")

    if (action == "setclass"):
        classno = params.get('class')
        print (classno)
        session['class'] = classno
        session['grade'] = str(classno) + " Grade"
        print (session['grade'])
        res = {"fulfillmentText": classno}
        return(jsonify(res))

        
    if (action == "getclass"):      
        if 'class' in session:  
            classs = session['class']
            print("Class is: ", classs)
            gradee = session['grade']
            print("Grade is: ", gradee)
            res = {"fulfillmentText": gradee}
            return(jsonify(res))
        else:
            print("Class not found in Session")    
            res = {"fulfillmentText": "Class not found in Session"}
            return(jsonify(res))

if __name__ == '__main__':
    app.run()

标签: flasksessiondialogflow-es

解决方案


你可以使用 Redis Session Store 来解决你的问题。由于您在 webbook 中创建了会话,但不允许最终用户与应用程序交互,这可能是罪魁祸首。

您可以执行以下操作。

  1. 转到以下链接:https ://github.com/aws-samples/amazon-elasticache-samples/blob/master/session-store/example-4.py

  2. 从会话存储部分下载类example-4.py

  3. 在您的烧瓶应用程序中进行设置。

  4. 如果您使用 Heroku,您可以通过执行以下命令来创建 Heroku Redis:

heroku addons:create heroku-redis:hobby-dev -a your-app-name
  1. Redis 会话存储需要两个输入值:TOKEN 和 REDIS URL。

  2. 按照步骤 4 中所述设置 Redis 后,您可以在 Heroku 应用程序的设置部分中获取 REDIS_URL 配置变量。

  3. 您必须通过在会话存储中指定它来为每个保持活动状态的用户创建一个唯一令牌。它被称为 TTL(密钥到期的剩余时间,以秒为单位)。如果您使用 dialogflow-fullfilment 包,您可以在 dialogflow 中创建它并使用 agent.session 轻松获取它。在下面的示例中,我将过期时间设置为一小时。

ttl=3600 
  1. 然后在您的代码片段中执行以下操作。
store = SessionStore(token, REDIS_URL)

if (action == "setclass"):
        classno = params.get('class')
        print (classno)
        store.set('class', classno)
        #session['class'] = classno
        store.set('grade', str(classno) + " Grade")
        #session['grade'] = str(classno) + " Grade"
        print (store.get('grade'))
        res = {"fulfillmentText": classno}
        return(jsonify(res))

        
    if (action == "getclass"):      
        if 'class' in session:  
            classs = session['class']
            print("Class is: ", classs)
            gradee = store.get('grade')
            #gradee = session['grade']
            print("Grade is: ", gradee)
            res = {"fulfillmentText": gradee}
            return(jsonify(res))
  1. 如果您以字节格式获取数据,那么您可以轻松地将其转换为整数或您喜欢的任何格式。这是一个示例: 如何将字节转换为整个十六进制字符串?

推荐阅读