连续检查文件是否存在Django中的AJAX

时间:2019-06-26 20:44:50

标签: javascript python jquery django ajax

我已经在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 %}

2 个答案:

答案 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);
      }
    }
  });
}