烧瓶异步功能结果

时间:2020-01-18 13:10:35

标签: python multithreading web flask backend

我正在构建我的第一个网络应用程序。我在这个项目中使用了flask和MySQL。
该应用程序的目的是让用户登录,仅需几个参数即可获得播放列表 由后端代码和MySQL查询生成的数据到我的数据库。
将使用他在注册时提供的一些数据为每个特定用户创建播放列表。

现在,假设用户请求播放列表,请求被接收,计算可能需要一段时间,
尽管用户执行的其他SQL查询可能很短。 (例如,查看我保存的播放列表)
我试图弄清楚如何结合flask和多线程,以便所有查询都将在单独的线程上执行(这是必须的),并且它们的响应可以返回给用户,但与此同时,用户正在等待,用户界面将显示加载动画。

代码示例;

#This is the home page where the user enters some data required for playlist creation
# he than can click a button which performs a get request to the function below to present the playlist

@app.route('/home/', methods=['GET'])
def home():
    return render_template('home.html')



# User sends a request for a playlist

@app.route('/playlist_create/', methods=['GET', 'POST'])
@login_required
def playlist_create():
    # User clicked the save button
    if request.method == 'POST':
        #... save playlist to data base

    # Get args
    ptype = request.args.get('type')
    mood = request.args.get('mood')
    user = session['userdata']
    #playlist object on another folder
    playlist = Playlist(ptype, mood,user)

    # -----Some sql queries to server that takes some time (but might be very short)------
    playlist.generate_from_db()
    return render_template('playlists.html', playlist=playlist)

所以我要实现的是功能

playlist.generate_from_db()

将在另一个线程(例如在线程池中)上执行,我将把渲染的加载页面返回给用户。
在生成播放列表时,将向用户显示加载动画, 当最终生成并完成加载动画时,加载动画将消失,并且从该数据生成的render_template('result.html',playlst=playlist)将以某种方式注入到同一页面, 或将请求重定向到显示结果的页面。
如何告诉用户请求已完成并显示数据?

我尝试过的事情

我找到了一些批处理作业的解决方案,这些解决方案不会从创建的线程中返回任何内容-并非如此。
在我的搜索中,我遇到了例如socketio库来解决此问题,问题是某些线程查询非常短,因此当我发出'job_finished'事件时,可以说该页面尚未加载,并且正在加载动画永远存在。

考虑在不通过我构建的容器完成线程的情况下循环,
但是jinja不允许使用while循环,这是浪费时间的忙碌等待。

我发现的另一个解决方案可能是Celery,根据我的理解,这需要-一种用于计算存储的代理。对于这个项目,这感觉有些过头了。
是否有任何简单方式使用python和flask完成此操作?

我是Web编程的新手,所以我试图找出执行此操作的正确方法, 以及使用什么。

感谢您的帮助!

0 个答案:

没有答案