python3 - 增加全局变量会导致bot在部署到heroku

时间:2017-08-21 11:29:06

标签: python dictionary heroku global-variables increment

我不确定如何说出这个问题,因为我不知道是什么导致了这个问题。我认为增加全局变量会导致问题在部署到Heroku时出现。

我有这个Bot,需要按顺序提问。我设法让它工作,当我在我的机器上测试它时工作正常。但是,当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)

因此,每当我从用户那里得到正确答案时,我都会递增计数器并将当前计数器值传递给测验函数。

例如:

初始计数器设置为0.如果用户单击继续按钮,计数器将递增1并将当前计数器值传递给测验(),然后测验功能显示下一个问题。

对于计数器0 =&gt; question_dict [ 'Locq0']

对于计数器1 =&gt; question_dict [ 'Locq1']

等等。这将发生在词典中的所有问题。

当我在我的机器上测试时,所有这一切都正常。但是当机器人部署到heroku时,我不知道计数器会发生什么,它会显示来自dict的随机问题。我还设置了一个调试文本来显示计数器值,并且它一直在变化。有时值为1,下一个值为3或4或0,或者它会重复。

Counter是一个全局变量,我认为这会导致heroku出现问题。 任何人都知道这有什么问题或为什么这样做?

1 个答案:

答案 0 :(得分:0)

快速回答:HTTP是无状态协议,因此您必须在http请求中传递整个状态,或者将状态存储在服务器端“会话”机制中。

更长的答案:Web应用程序通常由多进程前端Web服务器提供服务,这意味着您将有N个(隔离的)进程处理传入的HTTP请求。哪一个将提供哪个请求是完全不可预测的。 Iow你不能依赖全局变量(这是预处理)来保持请求之间的状态。

第一个解决方案是使用会话而不是全局(有很多方法可以使用烧瓶,所以google为“烧瓶会话”并选择你喜欢的任何方式)

另一个解决方案是将下一个quizz id传递给您的模板,以便可以使用表单或作为url的一部分提交(在url路径或查询字符串中)。