将常规消息发送回浏览器

时间:2019-06-10 20:13:43

标签: python flask

我有一个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中实现这一目标?

1 个答案:

答案 0 :(得分:1)

这个问题过去曾被问过几次(例如12),有2种常见解决方案。这不是一个超级简单或快速的解决方案:

  1. 将后台任务(即scraper.perform_func)移到单独的队列或工作服务(如CeleryPython-RQ)以减轻负担。两者在flask mega tutorial中都有很好的解释。对于您来说,结果是将进程放入队列中,并实施了一条新的Flask路由来读取进程的状态(例如,从数据库,会话中读取文本)。

  2. 切换到使用网络套接字,这将允许您的路线和UI之间进行异步通信。 Flask-SocketIO是从这里开始的好地方。