我正在构建我的第一个网络应用程序。我在这个项目中使用了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编程的新手,所以我试图找出执行此操作的正确方法,
以及使用什么。
感谢您的帮助!