flask bot api - 并发请求

时间:2016-09-11 15:47:44

标签: python flask flask-sqlalchemy

我试图为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如何处理多个并发请求/烧瓶应用程序上下文如何工作或类似的事情。

我还怀疑我的应用结构并不是特别明智(尽管这可能不会导致问题)。

非常感谢任何帮助。 感谢

0 个答案:

没有答案