Я думаю, что случайно назначил более одного сеанса фляги одному пользователю в моем чат-боте Facebook messenger - PullRequest
0 голосов
/ 29 марта 2019

Я создаю бота для 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)
...