我已经在Django中开发了一个应用程序,用户可以转到网站上的表单并输入Elasticsearch查询,然后生成供用户下载的报告。一切都很好,但最近在测试更多查询时,我们注意到有些查询返回很多结果,导致超时请求。
我们想做的是让Django不断检查文件是否存在(因为在完成之前不会将其写入本地系统),以防止出现超时问题。另外,一旦文件创建完成,我们想添加一个下载按钮,以便用户知道它已经完成。
在this教程之后,我向views.py添加了一个函数,并将其与url相关联,然后该url由我的html表单中的javascript代码块调用。因为我是刚接触AJAX,JQuery,Javascript和Django的人,所以我不太确定如何使其工作。主要是,我试图弄清楚如何获取它以继续检查文件是否已完成创建。如果这只是使用基本的Python,我会做一个while循环,但是我不清楚如何将其转换为JavaScript。
views.py
def check_progress(request):
"""
Returns whether document generation is complete or in progress
Returns 0 for in-progress, 1 for complete (either due to completion, or error)
"""
# check if file exists, return response as a JSON
file = "/report.docx"
data = {
"file_created": path.exists(file)
}
return JsonResponse(data)
urls.py
from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('', views.get_query, name='form'),
path('^ajax/check_progress/$', views.check_progress, name='check_progress')
] + static(settings.STATIC_URL, document_root=settings.STAT)
form.html
{% block javascript %}
<script>
$("#id_username").change(function () {
var username = $(this).val();
$.ajax({
url: '/ajax/check_progress/',
type: 'HEAD',
data: {
'file_exists': 'True'
},
dataType: 'json',
success: function (data) {
if (data.exists) {
alert("This file is not yet created");
}
}
});
});
</script>
{% endblock %}
答案 0 :(得分:1)
您可以使用setTimeout
定期运行Ajax请求
答案 1 :(得分:1)
您可以使用setInterval持续向后端发出请求,以查看文件是否完整。完成文件后,请清除间隔。
var checkInterval = setInterval(isFileComplete, 10000); //10000 is 10 seconds
function isFileComplete() {
$.ajax({
url: '/ajax/check_progress/',
type: 'HEAD',
data: {
'file_exists': 'True'
},
dataType: 'json',
success: function (data) {
if (data.exists) {
alert("This file is not yet created");
//add your own flag here to stop interval
clearInterval(checkInterval);
}
}
});
}