Django,在网页上显示python执行实时输出 - 作为控制台

时间:2018-06-07 11:45:28

标签: python ajax django asynchronous

(使用Django)我正在创建一个Web应用程序,这是它应该如何工作:

  1. 从网页 - 用户选择一个选项,点击它
  2. 网址点击关联的视图
  3. 在视图函数内部,另一个python模块函数启动处理 - 需要一段时间(可能是5分钟或2小时)
  4. 功能执行日志记录在网页上可见 - 实时执行在网页本身上可见(异步)
  5. 我发现,这可以使用AJAX实现。我试过这样的事情:

    views.py:

    from lib.testnew import testprint
    
    def printtest(request):
        if 'create_btn' in request.POST:
            test = testprint()
            data = test.printing()
            logger.info(data)
            return render(request, 'create.html', {'data': data})
        else:
            logger.info("initiating")
            return render(request, 'createvm.html')
    

    create.html上

    {% extends 'base.html' %}
    
    {% block content %}
    
    <script type="text/javascript">
        $(document).ready(function(){
    
            $('#create_vm_btn').click(function(){
                $.ajax({
                    type: "POST",
                    url: "printtest",
    
                    success: function(data) {
                      $("#output_id").html(data);
                      alert('Done: ' + data);
                    }
    
                });
            });
        });
    
    </script>
    <h2>Welcome {{ user.first_name }} {{ user.last_name }}</h2>
    <form method="post">
        <textarea id="output" row=3 cols=25></textarea>
        <button type="submit" class="btn btn-default" name="create_btn" id="create_btn">Create</button>
    </form>
    <script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
    {% endblock %}
    

    以下行需要时间来执行:

    data = test.printing()
    

    但它似乎没有奏效,正如我在要点中所解释的那样。请建议正确的方法。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望第一次致电开始&#34;处理&#34;以及后续调用显示进度。坏消息,它不会那么简单,因为明显的原因是调用&#34;处理&#34;视图中的函数将阻塞,直到&#34;处理&#34;函数返回。

这里的解决方案是使用异步任务队列(Celery是规范的解决方案 - 有更轻的解决方案,但Celery通过添加新的&#34;处理&#34;服务器,根据需要更容易扩展您的infra),一个第一个视图启动处理任务并返回一个任务ID和一个第二个视图(你可以使用ajax轮询)检查任务进度(或者你可以使用django-channels,如果你想得到想象但我建议你从制作开始这件事只适用于简单的ajax民意调查。)

此外,获得&#34;进展&#34;从日志文件中肯定不是最简单的解决方案。我们在这里做的是让芹菜任务存储Redis中的进度信息(我们已经将其用作芹菜结果后端)和&#34;民意调查&#34;视图读回来。请注意,您当然可以编写自己的$\[$来执行此操作(好吧,至少&#34;将它存储在Redis&#34;部分中)如果日志消息是您想要的那样&#34;进展的相关信息&#34;