Как периодически обновлять статус фоновой задачи в Django?

У меня есть проект django, который содержит длительный процесс. Для этого я использовал библиотеку django-background-tasks. Это работает, но я хочу создать страницу ожидания для пользователей и отображать статус задачи. Я должен обновлять эту страницу каждые 60 секунд и обновлять статус. Как я могу это сделать?

Спасибо.


person Aslı Kök    schedule 10.03.2020    source источник


Ответы (2)


Надеюсь, вы знаете об «Аяксе».

Как использовать Ajax с Django: https://simpleisbetterthancomplex.com/tutorial/2016/08/29/how-to-work-with-ajax-request-with-django.html

Как запускать код Ajax каждые n секунд: https://thisinterestsme.com/ajax-request-every-10-seconds/

Если вы хотите частично загрузить страницу, то вам следует разделить страницу на две части. Один должен содержать конкретный div, который вы хотите обновить или перезагрузить, рассмотрите имя страницы как partial_load.html. А на другой странице остальные коды могут иметь имя файла full_page.html. Partial_load.html можно включить в full_page.html с помощью тега include ({% include "partial_load.html" %})

 def refresh_page(request):
      if request.is_ajax():
           now = timezone.now()
           pending, running = get_process_status()
           context = {
             "pending": count_pending, 
             "running": count_running
             }
           return render(request, "partial_load.html", context)

full_page.html

 <html>
  <div> Something </div>
   .....
   <div id="status">
    {% include "partial_load.html" %}
   </div>
  ......
  <div> some more stuff </div>
 </html>
person Balasundar    schedule 10.03.2020

Если вы перенесли изменения базы данных после установки пакета background_task (тогда только в базе данных есть таблицы пакета background_task). Вы можете получить статус процессов, работающих в фоновом режиме, просто запросив модели background_task, например, запросив другие пользовательские модели.

from background_task.models import Task, CompletedTask
from django.utils import timezone

def get_process_status(parameters):
     now = timezone.now()
     # pending tasks will have `run_at` column greater than current time.
     # Similar for running tasks, it shall be
     # greater than or equal to `locked_at` column.
     # Running tasks won't work with SQLite DB,
     # because of concurrency issues in SQLite.
     # If your task still not started running and waiting in the queue, then you  can find it in pending_tasks

     pending_tasks = Task.objects.filter(run_at__gt=now)

     # If your your task is in running state, you can find it in running_tasks

     running_tasks = Task.objects.filter(locked_at__gte=now)

     # Completed tasks goes in `CompletedTask` model.
     # I have picked all, you can choose to filter based on what you want.
     # If your task completed you can find it in Completed task model.

     completed_tasks = CompletedTask.objects.all()

     # If you want the result in json format just add .values() at the end of the
     # ORM query like "completed_tasks = CompletedTask.objects.all().values()"     
     print(completed_tasks, running_tasks, pending_tasks)
     ......
     ......
     return process_status

Если вы хотите запускать функцию каждые 60 секунд, запланируйте задачу с помощью background_task. Образец кода:

@background(schedule=60)
def get_process_status(parameters):
  .....
  code
  .....
  return process_status

Надеюсь, это поможет вам.

person Balasundar    schedule 10.03.2020