Создание нескольких экземпляров класса Python во Flask - PullRequest
0 голосов
/ 22 мая 2018

Я создал приложение-флягу, которое получает и получает сообщения от пользователя и генерирует ответ из созданного мной бэкэнда Chatbot.Когда я запускаю свой файл app.py и захожу на свой локальный хост, он работает нормально, если я открываю только один экземпляр, однако, если я пытаюсь открыть несколько экземпляров, все они пытаются использовать один и тот же бот.Как мне создать уникального бота для каждой сессии.Я попытался использовать 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 голосов
/ 22 мая 2018

Проблема: новый бот создается каждый раз, когда пользователь отвечает на бот

Причина: app.before_request запускается до каждый запрос , который получает ваш колб-сервер,Следовательно, каждый ответ создаст новый экземпляр Bot2.Вы можете прочитать больше об этом здесь .

Проблема: создание бота на экземпляр

Возможное решение: я не совсем уверен, что выимеется в виду, открывая несколько экземпляров (вы пытаетесь запустить несколько экземпляров одного и того же сервера, или есть несколько пользователей, обращающихся к одному серверу).Я бы сказал, что нужно читать Sessions во Flask и хранить экземпляр Bot2 внутри сессий как переменную на стороне сервера.Вы можете прочитать больше об этом здесь и здесь .

0 голосов
/ 22 мая 2018

Вы можете попробовать назначить идентификатор сеанса из flask-login боту вместо создания уникального идентификатора перед запросом.Прямо сейчас, как сказал @Imma, для каждого запроса создается новый бот.

Вам нужно будет хранить массив классов.Когда создается сеанс, т. Е. Пользователь или анонимный пользователь входит в систему, создается экземпляр бота / класса, который помещается в массив.

Вы можете сохранить массив в объекте сеанса ... doобратите внимание, что объект сеанса будет передан в виде файла cookie во внешний интерфейс ... так что вы можете потенциально выставлять все сеансы чата ... Кроме того, многие пользователи будут излишне замедлять ответ.

Другой альтернативой является создание отдельного контейнера и запуск бота в качестве отдельного микросервиса, а не его интеграция с существующим приложением для фляги (именно это мы и сделали)

0 голосов
/ 22 мая 2018

Удалить строку bot2 = Bot2() и изменить всю ссылку на bot2 на g.bot2.

...