2017-08-21 6 views
0

問題の原因を知らないので、どのように質問を語りますかわかりません。私はグローバル変数を増やすことは、それがHerokuに配備されているときに問題を引き起こしていると思います。python3 - グローバル変数を増やすと、ヒロクにデプロイされたときにボットがレスポンスをランダム化させます

私は、この質問を順番に質問する必要があるボットを持っています。私はそれを動作させることができた、私はマシン上でそれをテストするとうまくいく。しかし、BotがHerokuに配備されたとき、それはナッツになり、ランダムな質問をし、無秩序の事実を順番どおりに示さない。ここで

は、それが

question_dict = { 
      'Locq0':[{'question':"Some question 0",'options':(["Continue","@continue"])}], 
      'Locq1':[{'question':"Some question 1",'options':(["Continue","@continue"])}], 
      'Locq2':[{'question':"Some question 2",'options':(["Continue","@continue"])}],} 

質問はdictの内部にあるどのように動作するかです。だから私は関数を作成して、その辞書をループしました。

def main(): 
    if user_payload == "@continue": 
     increment() 

counter = 0 
def increment(): 
    global counter 
    if counter <= len(question_dict): 
     counter += 1 
     quiz(counter) 

def quiz(counter): 
    question = question_dict['Locq{}'.format(counter)][0]['question'] 
    option = question_dict['Locq{}'.format(counter)][0]['options'] 
    # display the question and option 
    print(question) 
    print(option) 

私はユーザーから正解を得るたびに、カウンタをインクリメントし、現在のカウンタ値をクイズ関数に渡します。例えばについて

:ユーザーは、カウンタは1だけインクリメントされ続けるボタンをクリックし、クイズに現在のカウンタ値を合格した場合、初期カウンタが0に設定されている

()は、次にクイズ機能は次を表示します質問。カウンタ0 => question_dict [ 'Locq0']カウンタの

1 => question_dict [ 'Locq1']

そしてようにするため

。これは、dictにあるすべての質問に対して行われます。

私のマシンでテストすると、これはすべて正常に動作します。しかし、ボットが英雄に配備されたとき、私はカウンターに何が起こるのかわからない。私はまた、カウンタの値を表示するデバッグテキストを設定し、それはすべての時間を変更します。値が1で、次の値が3または4または0の場合もあれば、それ自体を繰り返す場合もあります。

カウンタはグローバル変数で、私はそれが英雄の問題を引き起こしていると思います。 これに何が間違っているのか、それが何をしているのか誰でも知っていますか?

+0

なぜグローバルにする必要があるのですか?私はあなたが 'インクリメント'と呼ぶ場所も見ませんか? – roganjosh

+0

「herokuに展開されました」とはどういう意味ですか?それはどのように役立つのですか?フラスコのようなフレームワークを使ったウェブアプリケーションとして? –

+0

@bruno desthuilliersフラスコを使用しています –

答えて

0

クイックアンサー:HTTPはステートレスなプロトコルなので、全体の状態をHTTPリクエストに渡すか、サーバ側の「セッション」メカニズムに状態を​​格納する必要があります。

長い回答:Webアプリケーションは、通常、マルチプロセスフロントWebサーバーによってサービスされます。つまり、着信HTTPリクエストを処理するN個のプロセスがあります。どちらが要求に役立つかは全く予測できません。 IOWでは、リクエスト間で状態を保持するために、グローバル(前処理)に依存することはできません。

最初のソリューションは、セッションの代わりに、グローバルを使用することです(そうフラスコとその「フラスコセッション」のためのGoogleとあなたが好きな選択するためにかなりの数の方法があります)

他のソリューションを渡すことです次のquizz idをテンプレートに追加して、フォームまたはURLの一部(URLパスまたはクエリー文字列のいずれか)として送信できます。

+0

だから、私は自分のマシンでそれを実行すると、それは私の要求だけを処理するサーバなので、正しい応答を返します。セッションを使用すると、アプリケーションを使用する各ユーザーに新しい独立した環境が作成されますか?セッションを使用すると、テスト環境で他のユーザーのために機能しますか? @ bruno desthuilliers –

+0

あなたのdev envで@HarowitzBlackあなたは確かに単一のサーバープロセスを持っている可能性があります - それがうまくいく理由です。また、セッションは「新しい分離環境」を作成しません。サーバープロセス間で共有されるユーザーごとの状態を格納する単なる方法です。これは、このセッションIDがセッションデータにマップされている「セッションクッキー」(いくつかの一意のセッションIDを持つクッキー)といくつかの共有記憶装置(レディス、リレーショナルデータベースなど)を使用して行われます。 –

関連する問題