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

2024-04-19 04:32:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在messenger平台上制作一个聊天机器人,我问用户一系列问题。但是,当用户回答第一个问题时,它将直接转到中的回退意图美国石油学会我必须一直回答同一个问题直到下一个问题。 我以为设置sessionID可以解决这个问题,但是没有

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

当一个新的请求(当用户回答问题时),即使senderID是相同的(senderID是facebook发送的用户ID),uuid1的输出有时也会发生变化。因此,我尝试将uuid1的值保存到字典中,如果用户回答的是第一个问题,则新请求将首先检查字典对于senderID,如果它已经存在,则不会为同一senderID生成新的uuid。 但问题是有时当一个新请求(来自同一个用户)命中heroku时,字典中的值就会消失。这种情况不是每次都会发生,但90%的时候都会发生。 这是一个新请求的日志。在

^{pr2}$

我该怎么做才能保持价值。还有其他方法吗? 我是个新手,我被这个问题困扰了一个星期。在


Tags: 用户字典uuid机器人平台reqmessenger意图
1条回答
网友
1楼 · 发布于 2024-04-19 04:32:38

字典可能未绑定到会话,可能超出范围并从内存中清除。所以你存储在那里的任何东西都不会被可靠地持久化。有两种方法可以解决这个问题。第一种方法是使用独立的缓存服务器(如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

可以使用检查缓存以查看值是否存在

^{pr2}$

第二种方法是将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)

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

相关问题 更多 >