В настоящее время я работаю над веб-приложением проекта, используя Django. Я заранее подготовил скрипты (Python), которые отлично работают, но я столкнулся с проблемой, пытаясь реализовать ее с помощью Django. Я использовал сеансы html-запросов, чтобы поддерживать соединение http во время повторных запросов. Должен ли я использовать Django Channels или StreamHttpResponse для того же эффекта или что-то совсем другое?
В основном, jQuery с AJAX для многократного вызова view.function до тех пор, пока не будет выполнено требование, но так как каждый раз при получении URL-адреса с помощью session.get создается новый сеанс, поэтому я возвращаю неверные данные при попытке навигации по странице. Поиск всего, что связано с django, даст мне результаты сессий django.
Мне удалось сохранить произвольные данные с помощью сеансов django или обновления базы данных, поскольку я не смог найти способ сохранить пользовательский класс между этими вызовами, единственной проблемой сейчас является сохранение http-соединения.
Стоит ли искать StreamHttpResponse, каналы Django или что-то еще целиком?
views.py
def search_for_product(request):
current_user = request.user
task_id = request.GET.get('task_id', None)
current_task = GetWebsite(current_user, task_id)
if current_task.configured_task.final_result:
current_task.configured_task.search_again()
elif current_task.configured_task.item_found:
if current_task.configured_task.item_details_found:
current_task.configured_task.finalize_result()
else:
current_task.configured_task.find_details()
else:
current_task.configured_task.find_item()
data = {
'status': current_task.configured_task.current_status
}
time.sleep(5)
return JsonResponse(data)
Как правило, search_for_product (результат) будет вызываться постоянно, пока не будут сохранены окончательные результаты. Я возвращаю состояние (булево) для определения того, удалось ли ему найти элемент, получил ли он сведения об элементе и готов ли показать результаты, которые моя функция AJAX использует для повторения, пока final_result не станет True. Это работает нормально, за исключением того, что мне нужно держать httpconnection открытым, иначе сайт не покажет правильные результаты и не сможет выполнить второй вызов при поиске сведений об элементе.
function getStatus(statusLabel, rowID, taskID) {
allTasks[rowID] = $.ajax({
url: 'http://localhost:8000/page/search-for-product/',
method: 'GET',
data: {
'task_id': taskID
},
dataType: 'json'
}).done(function(data) {
if (data.final) {
console.log(data.status);
} else {
statusLabel.style.color = 'green';
statusLabel.textContent = data.status;
console.log(data.status);
getStatus(statusLabel, rowID, taskID);
}
}).fail(function(data) {
console.log(data.task_id);
statusLabel.textContent = data.status;
});
}