【问题标题】:Continuously check if file exists with AJAX in Django在 Django 中使用 AJAX 持续检查文件是否存在
【发布时间】:2019-06-27 05:02:17
【问题描述】:

我在 Django 中开发了一个应用程序,用户在该应用程序中访问网站上的表单并输入 Elasticsearch 查询,然后生成报告供用户下载。这一切都很好而且花花公子,但最近在测试更多查询时,我们注意到有些返回很多结果导致超时请求。

我们发现我们想做的是让 Django 不断检查文件是否存在(因为在完成之前它不会被写入本地系统)以防止出现超时问题。此外,一旦文件创建完成,我们希望添加一个下载按钮,以便用户知道它已完成。

按照this 教程,我在views.py 中添加了一个函数,并将它与一个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 %}

【问题讨论】:

    标签: javascript python jquery django ajax


    【解决方案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);
          }
        }
      });
    }

    【讨论】:

    • 我是 JavaScript 的新手,如果这是一个愚蠢的问题,我深表歉意,但 add your own flag here to stop interval 是什么意思?那基本上是在说when file is complete, clearInterval吗?
    • @carousallie 是的,就是这样。假设正在返回的数据对象有一些状态为完成,您检查以确保正确返回,然后您可以使用函数 clearInterval()
    • 那么我可以用 if-else 语句代替吗?喜欢success: function (data) {if (data.exists) {alert("Your file is ready to download!"); clearInterval(checkInterval); } else {alert("Your report is still being created, please hold.")}} 还是不能满足我的需求?
    • @carousallie 是的,你绝对可以这样做,结果都是一样的!
    【解决方案2】:

    您可以使用setTimeout 定期运行您的 Ajax 请求

    【讨论】:

      猜你喜欢
      • 2018-10-22
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      • 2012-02-27
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多