我有一个Flask应用,该应用在按下表单提交按钮后会进行一些处理
{% if argName is defined %}
<script>
$(function(){
var element = document.getElementById('argumentName');
element.value = '{{ argName }}';
$(".compbtn:first-child").text('{{ argName }}');
$(".compbtn:first-child").val('{{ argName }}');
});
</script>
{% endif %}
<form action="/explore" method="post" role="form" id="log_form">
<div class="form-group">
<div class="row">
<div class="col-sm-4">
<input class="span2" id="argumentName" name="argumentName" type="hidden">
<div class="dropdown">
<button class="btn btn-primary dropdown-toggle argbtn" type="button" data-toggle="dropdown">Available Arguments
<span class="caret"></span>
</button>
<ul class="dropdown-menu argDrop" role="menu" aria-labelledby="dropdownMenu" id="argDropDown">
{% for arg in arguments %}
<li role="presentation" onclick="$('#argumentName').val('{{ arg }}');"><a role="menuitem" href="#">{{ arg }}</a></li>
{% endfor %}
</ul>
</div>
</div>
<div class="col-sm-4">
Year: <input type="text" name="year" id="year" size="10">
</div>
<div class="col-sm-4">
Month: <input type="text" name="month" id="month" size="10">
</div>
</div>
</div>
<input type="submit" class="btn btn-success">
</form>
这是服务器端
@app.route('/explore', methods=['GET', 'POST'])
def explore():
global unique_arguments
if not unique_arguments:
scraper = BasicScraper()
unique_arguments = scraper.get_arguments()
arg_name = str(request.form['argumentName'].encode('utf-8').strip())
if request.form['year'] and request.form['month']:
form = ReusableForm(request.form)
app.logger.error(form.errors)
year_to_look_for = str(request.form['year'].encode('utf-8').strip())
month_to_look_for = str(request.form['month'].encode('utf-8').strip())
scraper = BasicScraper()
scraper.perform_func(arg_name, year_to_look_for, month_to_look_for)
return render_template('home.html', arguments=unique_arguments, argName=arg_name)
现在,我想定期将字符串返回到网页。
scraper.perform_func(arg_name, year_to_look_for, month_to_look_for)
方法可以更改为产生我需要的字符串。我想在网页上的某个位置显示此字符串。
这将帮助我查看进度。
我如何在Flask中实现这一目标?
答案 0 :(得分:1)
这个问题过去曾被问过几次(例如1,2),有2种常见解决方案。这不是一个超级简单或快速的解决方案:
将后台任务(即scraper.perform_func
)移到单独的队列或工作服务(如Celery或Python-RQ)以减轻负担。两者在flask mega tutorial中都有很好的解释。对于您来说,结果是将进程放入队列中,并实施了一条新的Flask路由来读取进程的状态(例如,从数据库,会话中读取文本)。
切换到使用网络套接字,这将允许您的路线和UI之间进行异步通信。 Flask-SocketIO是从这里开始的好地方。