2017-11-18 205 views
0

我在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 

我该如何保留价值。还有其他方法吗? 我是一个新手,我一直陷在这个问题一个星期。

回答

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) 

第二方式是使用烧瓶的缓存工具与SimpleCache或LRUCache。下面是缓存值,以后可以用

key = sender_id 
event = cache.get(key) 

但是你需要记住retrived使用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 

的例子,如果你用使用的高速缓存工具的第二选择相同的服务器,然后每次您的服务器重新启动时,您将丢失值,但它们应该在整个会话期间都可用。

+0

当服务器重新启动时我不会失去redis的值吗? –

+0

如果你把它安装在同一台机器上,是的。但是大多数我认识的人,至少有一些新开发人员使用某种云服务来进行redis(azure,aws等),因为它运行在不同的服务器上,所以他们不会重置。 此外,如果答案帮助你,请接受它 – Akshay

相关问题