Flask-SQLKechemy的Flask-socketio上下文

时间:2018-03-13 09:32:51

标签: flask flask-sqlalchemy flask-socketio

我正在使用Flask,Flask-Socketio和Flask-SQLAlchemy创建实时报告应用程序。我当前的设计在连接上创建了一个后台线程,它查询API并插入到应用程序数据中。但是,运行此时,我收到错误

public class Event { String eventId; String eventName; String eventSport; public Event(String eventId, String eventName, String eventSport){ this.eventId = eventId; this.eventName = eventName; this.eventSport = eventSport; } public String getEventId() { return eventId; } public String getEventName() { return eventName; } public String getEventSport() { return eventSport; }

flask_react_app.py:

RuntimeError: No application found. Either work inside a view function or push an application context.

我有两个问题。首先提到的错误,其次,必须有更好的方法!

2 个答案:

答案 0 :(得分:3)

您的问题与Flask-SocketIO无关,但要在后台线程中使用Flask-SQLAlchemy,您需要一个应用程序上下文。

尝试以下方法:

def background_thread(app):
    """Example of how to send server generated events to clients."""
    with app.app_context():
        while True:
            socketio.sleep(10)
            socketio.emit("my_response", generate_data())

然后在启动后台线程的位置将应用程序实例作为参数传递:

thread = socketio.start_background_task(target=background_thread, args=(current_app._get_current_object(),))

答案 1 :(得分:2)

Miguel的答案是正确的,但如果两个关键字参数都传递给函数,则会引发下一个异常:

TypeError: background_thread() got an unexpected keyword argument 'args'

所以你必须只通过

thread = socketio.start_background_task(background_thread, (current_app._get_current_object()))