(使用Django)我正在创建一个Web应用程序,这是它应该如何工作:
我发现,这可以使用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()
但它似乎没有奏效,正如我在要点中所解释的那样。请建议正确的方法。
答案 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;