Я разработал приложение в 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 %}