在Flask中创建Python类的多个实例

时间:2018-05-22 01:59:09

标签: python web flask chat chatbot

我做了一个烧瓶应用程序,它从用户获取和接收消息,并从我创建的Chatbot后端生成回复。当我运行我的app.py文件并转到我的localhost时,如果我只打开一个实例,它运行正常,但是如果我尝试打开多个实例,那么它们都会尝试使用相同的机器人。如何为每个会话创建一个独特的bot。我尝试使用g.bot = mybot(),但问题是每次用户回复机器人时它仍然会继续创建一个新机器人。我对此比较陌生,所以我们将非常感谢您对详细解释的链接。请注意,某些代码段与先前版本中的无关垃圾邮件不同。

app = Flask(__name__)
items = ["CommonName","Title", 
                      "Department","Address","City","PhoneNum"]
app.config.from_object(__name__)
bot2 = Bot2()

@app.before_request
def before_request():
    session['uid'] = uuid.uuid4()
    print(session['uid'])
    g.bot2 = Bot2()


@app.route("/", methods=['GET'])
def home():
    return render_template("index.html")

@app.route("/tables")
def show_tables():
    data = bot2.df
    if data.size == 0:
        return render_template('sad.html')
    return render_template('view.html',tables=[data.to_html(classes='df')], titles = items)

@app.route("/get")
def get_bot_response():
    userText = request.args.get('msg')
    bot2.input(str(userText))
    print(bot2.message)
    g.bot2.input(str(userText))
    print(g.bot2.message)
    show_tables()
    if (bot2.export):
        return (str(bot2.message) + "<br/>\nWould you like to narrow your results?")
        #return (str(bot.message) + "<a href='/tables' target=\"_blank\" style=\"color: #FFFF00\">click here</a>" + "</span></p><p class=\"botText\"><span> Would you like to narrow your results?")
    else:
        return (str(bot2.message))

if __name__ == "__main__":
    app.secret_key = 'super secret key'
    app.run(threaded=True)

3 个答案:

答案 0 :(得分:2)

  

问题:每次用户回复僵尸程序时都会创建一个新的僵尸程序

原因:SELECT * FROM tableName WHERE ID IN ('ADD9', 'ADD10', 'ADD11') AND Quantity > 0 在烧瓶服务器收到的每个请求之前运行。因此,每个回复都将创建一个新的app.before_request实例。您可以阅读更多相关信息here

  

问题:为每个实例创建一个机器人

可能的解决方案:我不确定你打开多个实例是什么意思(你是在尝试运行同一服务器的多个实例,还是有多个ppl访问单个服务器)。我会说要读取Flask中的Sessions并在会话中存储Bot2实例作为服务器端变量。您可以详细了解herehere

答案 1 :(得分:1)

您可以尝试将会话ID从flask-login分配给机器人,而不是在请求之前创建唯一ID。现在,就像@Imma所说的那样,每个请求都会创建一个新的机器人。

您必须存储一组类。创建会话时,即用户或匿名用户登录时,会创建一个bot /类实例并将其推送到阵列上。

您可以将数组保留在会话对象中...请注意会话对象将以cookie的形式传输到前端...因此您可能会暴露所有聊天会话...此外,许多用户将不必要地减慢响应速度。

另一种方法是创建一个单独的容器并将机器人作为单独的微服务运行,而不是将其与现有的烧瓶应用程序集成(这就是我们最终做的事情)

答案 2 :(得分:-1)

删除第bot2 = Bot2()行,并将bot2的所有引用更改为g.bot2