Постоянно проверять, существует ли файл с AJAX в Django - PullRequest
1 голос
/ 26 июня 2019

Я разработал приложение в Django, где пользователь переходит на форму на сайте и вводит запрос Elasticsearch, а затем создает отчет для загрузки пользователем. Все работает отлично, но в последнее время при тестировании еще нескольких запросов мы заметили, что некоторые возвращают много результатов, что приводит к запросу на тайм-аут.

Мы выяснили, что нам хотелось бы, чтобы Django постоянно проверял, существует ли файл (потому что он не будет записан в локальную систему, пока не будет завершен), чтобы предотвратить проблему тайм-аута. Кроме того, после создания файла мы хотим добавить кнопку загрузки, чтобы пользователь знал, что это сделано.

После этого урока я добавил функцию в мои views.py и связал ее с URL-адресом, который затем вызывается блоком кода JavaScript в моей HTML-форме. Поскольку я новичок в использовании 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 ]

1 голос
/ 27 июня 2019

Вы можете использовать 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);
      }
    }
  });
}
1 голос
/ 26 июня 2019

Вы можете использовать setTimeout для регулярного запуска вашего Ajax-запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...