我试图为Facebook messenger机器人创建后端,但是当多个用户同时与系统通话时(通过信使平台),代码似乎有问题。
我的筹码是: 烧瓶 Flask-sqlalchemy(连接到Azure上的MS SQL DB) 堆栈在azure web app上运行
简化的应用程序结构如下:
app/
___init___.py
mod_bot/
bot.py
mod_db/
model.py
tools.py
app创建如下:
app / __ init __。py:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask import request, Response
import traceback
import app.mod_bot.bot as bot
import json
app = Flask(__name__)
app.config.from_object('AbiBotApp.config')
db = SQLAlchemy(app)
@app.route('/webhook', methods=['GET', 'POST'])
def webhook():
if request.method == 'POST':
try:
bot.process_incoming(json.loads(request.get_data(as_text=True)))
return Response(status=200)
except Exception:
print(traceback.format_exc())
elif request.method == 'GET':
if request.args.get('hub.verify_token') == app.config['VERIFY_TOKEN']:
return Response(request.args.get('hub.challenge'), status=200)
return Response("Error, invalid token", status=200)`
bot模块处理请求并将消息发送回用户。处理" get_next_message"函数需要时间并且还会调用DB以获取其他数据(为简单起见,此处不包括在内)。显然,在此期间,可以向应用程序发出其他请求。
应用程序/ mod_bot / bot.py:
from app import app
import json
import app.mod_db.tools as db_tools
def process_incoming(data):
user = db_tools.get_user(data['id'])
last_message = user.last_message
new_message = data['message']
next_message = get_next_message(last_message, new_message)
user = db_tools.update_user(user, next_message)
send_message(user, next_message)
...
def get_next_message(last_message, new_message):
# CONVERSATION LOGIC
def send_message(user, next_message):
# SEND MESSAGE TO FB API
我将数据库操作和模型分为以下几部分:
应用程序/ mod_db / model.py:
from app import db
# ---- USER DATA MODEL ---- #
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.BigInteger, primary_key=True)
last_message = db.Column(db.String(255))
应用程序/ mod_db / tools.py:
from app import app, db
from app.mod_db.model import User
def get_user(id):
""" Find existing user """
user = User.query.filter(User.id == int(id)).first()
return user
def update_user(user, last_message):
user.last_message = last_message
db.session.commit()
return user
当一个用户正在与应用程序通信(通过信使平台)时,一切正常,但是当多个人进行交互时,似乎存在问题。主要问题是用户接收对方的下一条消息......
我假设我误解了flask和sqlalchemy如何处理多个并发请求/烧瓶应用程序上下文如何工作或类似的事情。
我还怀疑我的应用结构并不是特别明智(尽管这可能不会导致问题)。
非常感谢任何帮助。 感谢