Flask:如何在变量中保留一段时间的值?

时间:2017-11-18 12:16:35

标签: python heroku flask

我正在使用Messenger平台上的聊天机器人,我正在向用户询问一系列问题。但是,当用户回答第一个问题时,它会直接转到Api.AI中的后备意图,我必须保持回答同样的问题,直到下一个问题。 我认为设置sessionID将解决问题,但事实并非如此。

ai = ApiAI(os.environ["APIAI_TOKEN"])
req = ai.text_request()
    req.session_id = str(uuid.uuid1(int(str(senderID)[0:15])))

事实证明, uuid1 的输出有时会在新请求(用户回答问题时)时发生变化,即使senderID相同(senderID是facebook发送的用户ID)。所以,我正在尝试将uuid1的值保存到字典中,如果用户回答第一个问题,新请求将检查字典中的senderID,如果已存在,则不会为同一senderID生成新的uuid 。 但问题是有时当一个新请求(来自同一个用户)命中heroku时,字典中的值就消失了。这种情况不是每次都会发生,而是大约90%的时间。 这是新请求的日志。

2017-11-18T09:43:03.784670+00:00 heroku[router]: at=info method=POST path="/" host=website.com request_id=ab6d6488-0343-4c68-9b2a-d6faf2ee2302 fwd="173.252.123.140" dyno=web.1 connect=0ms service=633ms status=200 bytes=161 protocol=https

我该如何保留价值。还有其他方法吗? 我是新手,我已经被困在这个问题上一个星期了。

1 个答案:

答案 0 :(得分:0)

字典可能没有绑定到会话,可能会超出范围并从内存中清除。所以你在那里存储的任何东西都不会被可靠地保留下来。有两种方法可以解决这个问题。第一种是使用像Redis这样的单独缓存服务器来存储你的值,第二种是在Flask本身使用缓存工具。

如果您打算使用外部redis服务器,可以执行类似下面的代码

import redis

# instantiate the redis db
REDIS_HOST = <REDIS_HOST>
REDIS_PORT = <REDIS_PORT>
redis_db = redis.StrictRedis(host=REDIS_HOST,port=REDIS_PORT)

key = sender_id
event = {}
event["uuid"] = uuid1
event["sender_id"] = sender_id
redis_db.delete(key) #remove old keys
redis_db.hmset(key, event)
redis_db.expire(key, 259200) #3 days (you can set your own expire time in seconds

您可以使用

检查缓存以查看值是否存在
key = sender_id
if redis_db.exists(key):
    event = redis_db.hgetall(key) 

第二种方法是使用flask的缓存工具与SimpleCache或LRUCache。以下是使用SimpleCache

的示例
from werkzeug.contrib.cache import SimpleCache
cache = SimpleCache()

key = sender_id
event = {}
event["uuid"] = uuid1
event["sender_id"] = sender_id

cache.set(key,event,timeout=259200) # 3 days

稍后可以使用

重试缓存值
key = sender_id
event = cache.get(key)

但是,您需要记住,如果您在同一台服务器上使用第二个使用缓存工具的选项,那么每次服务器重新启动时,您将丢失这些值,但它们应该在整个会话期间可用。