Я создаю бота для Facebook Messenger, используя Flask.Используя функцию привязки аккаунта, пользователь может войти на мою стороннюю веб-страницу, а затем я сохраняю их код авторизации в сеансе фляги.Затем приложение будет распознавать сеанс пользователя с перерывами.В одном сообщении он узнает моего пользователя и его сеанс, а в следующий раз у меня не будет никакого сеанса, связанного с ним, затем через несколько сообщений он снова распознает сеанс пользователя.
Я должен отметить, что мое приложение Flask принимает запросы от Facebook, а затем отправляет запросы в диалоговый поток, который затем отправляет запросы на выполнение.Выполнение запросов из диалогового потока - это момент, когда я добавляю данные сеанса.Сначала я подумал, что может быть проблема с памятью во время сеансов во флеш-памяти, поэтому я начал использовать redis для хранения сеансов, но проблема сохранилась.Я нашел действительно старый вопрос с похожей проблемой, и они сказали, что это потому, что Facebook назначил два разных куки, потому что они запускали сайт локально 27.0.0.1:5000, но иногда сайт былдоступ на локальный хост: 5000.
Я не совсем уверен, как работает хостинг веб-приложений, поэтому я не уверен, что это проблема, с которой я столкнулся, и я также не знаю, как я мог бы это исправить, если это проблема.Я использую ngrok с localhost: 80 в качестве своего webhook (также для входа на веб-страницу).
Есть ли другие причины, по которым это может происходить?Если это проблема с несколькими файлами cookie, есть ли способ ее обойти?Вот что я имею в виду сессий:
from flask import g, session, request
from flask_session import Session
from waitress import serve
import redis
import dialogflow_v2
app = Flask(__name__)
SECRET_KEY = os.urandom(24)
SESSION_TYPE = "redis"
SESSION_REDIS = redis.from_url('redis://localhost:6379')
app.config.from_object(__name__)
sess = Session()
sess.init_app(app)
# @app.route("/", methods=["GET", "POST"])
# *take request from facebook and call dialogflow API* ...
@app.before_request
def before_request():
g.user = None
g.psid = None
g.platform = None
print(session)
if 'user' in session:
g.user = session['user']
if 'psid' in session:
g.psid = session['psid']
# @app.route("/webhook", methods=["GET", "POST"])
def webhook():
# *take request from dialogflow*...
action = req.get('queryResult').get('action')
if action =="linked":
auth_code = req.get('queryResult').get('parameters').get('number')
session_code = req.get('session')
sessionID = session_code.split('/')[-1]
session['user']= str(auth_code)
session['psid'] = sessionID
session['platform'] = 'dialogflow'
session.modified = True
# *send back a response*...
elif action == "unlinked":
session.pop('user', None)
session.pop('psid', None)
session.modified = True
# *send back a response*...
if __name__ == "__main__":
port = int(os.getenv("PORT", 80))
print("Starting app on port %d" %(port))
serve(app, host='0.0.0.0', port=port)