2017-11-18 6 views
0

私はメッセンジャープラットフォームでチャットボットを作っていますが、私はユーザーに一連の質問をしています。しかし、ユーザーが最初の質問に答えると、Apiのフォールバックインテントに直接移動します。それが次の質問に行くまで同じ質問。 私はsessionIDを設定して問題を修正すると思ったが、問題は解決しなかった。Flask:一定の期間、変数に値を保持する方法はありますか?

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を生成しません。 しかし、同じユーザーからの新しい要求が英雄にヒットすると、辞書の値がなくなってしまうことがあります。これは毎回起こるのではなく、時間の約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

辞書はセッションに結ばれていない可能性があり、スコープを使い果たし、メモリから消去される可能性があります。あなたがそこに保管しているものは、確実に永続することはありません。この問題を解決する方法は2つあります。最初は、Redisのような別のキャッシュサーバーを使用して値を格納し、もう1つはFlask自体にキャッシュツールを使用することです。あなたは外部のRedisのサーバーを使用する予定の場合は

は、あなたは値が

key = sender_id 
if redis_db.exists(key): 
    event = redis_db.hgetall(key) 

二使用して存在しているかどうかを確認するためにあなたがキャッシュをチェックすることができ

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 

次のコードのような何かを行うことができますフラスコのキャッシュツールをSimpleCacheまたはLRUCacheで使用する方法です。以下は、あなたが上のキャッシュツールを使用しての2番目のオプションを使用している場合があることに注意してくださいする必要がありますただしキャッシュ値が後で

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

関連する問題