Возникли проблемы с глобальной переменной в Python и строке API

Я пытаюсь построить ответный бот, используя строки api и python 2.7.15 . это мой код

from flask import Flask, request, abort
from linebot import (LineBotApi, WebhookHandler)
from linebot.exceptions import (InvalidSignatureError)
from linebot.models import (MessageEvent, TextMessage, TextSendMessage,)

app = Flask(__name__)
line_bot_api = LineBotApi('UIXwXWExxxxxxxxxxxxxxxxxxxxxxxxxxxx')
handler = WebhookHandler('458033a97c124xxxxxxxxxxxxxxxxxxxxx')
number = 1

@app.route("/")
def hello():
    return str(number)

@app.route("/webhook", methods=['POST'])
def webhook():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    text = event.message.text
    user_id = event.source.user_id

    if(text == 'inc'):
        #set global variable here
        number += 1
        line_bot_api.push_message(user_id,TextSendMessage(text=str(number)))


if __name__ == "__main__":
    app.run()

Затем я реализую это на heroku, и я пытаюсь пообщаться с моим ботом, сначала я отправляю сообщениеincон мне ответит 2тогда я пытаюсь отправить inc еще раз он мне ответит 3 и я пытаюсь снова, он отвечает мне 1я пытаюсь отправить inc еще раз он мне ответит 4что не так? почему мой номер не продолжается?

1 ответ

Решение

Внутренние приложения Python обычно развертываются в многопроцессорной конфигурации (передний сервер - apache, ngnix или любой другой - запускает несколько параллельных процессов для обработки входящих запросов), и любой запрос может обслуживать любой запрос. Глобальные переменные относятся к каждому процессу, поэтому то, какое состояние вы найдете, зависит от того, какой процесс обработал запрос. Вывод: не используйте глобальные переменные для хранения состояния приложения - используйте общую базу данных (любого рода, она не обязательно должна быть базой данных SQL, она просто должна быть общей для всех процессов).

Другие вопросы по тегам