Как периодически обновлять статус фоновой задачи в Django? - PullRequest
1 голос
/ 10 марта 2020

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Надеюсь, вы знаете о Ajax.

Как использовать 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, который вы хотите обновить sh или перезагрузить, считайте имя страницы частичным_загрузкой. html. А на другой странице могут быть оставшиеся коды, которые рассматривают имя файла как full_page. html. Частичная_загрузка. html может быть включена в full_page. html с помощью тега включения ({% include "частичная_загрузка. 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>
0 голосов
/ 10 марта 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

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

...