我不确定如何说出这个问题,因为我不知道是什么导致了这个问题。我认为增加全局变量会导致问题在部署到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出现问题。 任何人都知道这有什么问题或为什么这样做?
答案 0 :(得分:0)
快速回答:HTTP是无状态协议,因此您必须在http请求中传递整个状态,或者将状态存储在服务器端“会话”机制中。
更长的答案:Web应用程序通常由多进程前端Web服务器提供服务,这意味着您将有N个(隔离的)进程处理传入的HTTP请求。哪一个将提供哪个请求是完全不可预测的。 Iow你不能依赖全局变量(这是预处理)来保持请求之间的状态。
第一个解决方案是使用会话而不是全局(有很多方法可以使用烧瓶,所以google为“烧瓶会话”并选择你喜欢的任何方式)
另一个解决方案是将下一个quizz id传递给您的模板,以便可以使用表单或作为url的一部分提交(在url路径或查询字符串中)。