Возвращать прогресс в шаблон при каждом изменении значения в Django - PullRequest
0 голосов
/ 21 октября 2019

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

У меня есть вызов ajax для получения окончательного значения,В бэкэнде это займет много времени, чтобы завершить работу, но каждый раз, когда у меня есть прогресс работы в одной переменной, я хочу показать значения этой переменной во внешнем интерфейсе.

Например, мойФункция ajax

def ajax_call(request):
    j = 0
    for i in range(1,10000):
        j += i
    res = {'data': j}
    return JsonResponse(res, safe=False)

Как мы знаем, она вернет окончательное значение j. Но я хочу показывать значение j во внешнем интерфейсе при каждом изменении. Есть ли простой способ сделать это с помощью сельдерея или что-то

1 Ответ

1 голос
/ 21 октября 2019

вы не можете отобразить каждое значение j без завершения запроса, поэтому, завершив сам процесс.

Но вы можете сделать несколько обходных путей, например, иметь поле состояния в некоторой модели, чтобы получить этозначение оттуда и передать его вашему пользователю, это должно работать с задачей сельдерея или чем-то еще.

Какой-то простой код (не тестировался)

В вашем models.py

class TaskStatus(models.Model):
    STATUS_ONEPERCENT = 'zeropct'
    STATUS_ONEPERCENT = 'onepct'
    STATUS_TENPERCENT = 'tenpct'
    CHOICES_STATUS = (
        (STATUS_ZEROPERCENT, _('0%')),
        (STATUS_ONEPERCENT, _('1%')),
        (STATUS_TENPERCENT, _('10%')),
    )
    user = models.ForeignKey(
        get_user_model(), 
        verbose_name=_('User task owner'),
        related_name='tasks_statuses')
    task_uuid = models.CharField(verbose_name=_('Taks unique ID'), maxlength=50)
    status = models.CharField(
        verbose_name=_('Task status'), 
        choices=CHOICES_STATUS, 
        default=CHOICES_STATUS[0][0])

В ваших представлениях

def create_taskstatus(request):
    newts = TaskStatus.objects.create(
        user=request.user,
        task_uuid=uuid.uuid1())
    res = {
        'tsuuid': newts.task_uuid,
        'status': newts.status, 
        'status_hr': newts.get_status_display()  # human readable status
    }
    return JsonReponse(res, safe=False)

def get_taskstatus(request, tsuuid):
    user_task = get_user_model().tasks_statuses.get(task_uuid=tsuuid)
    res = {
        'tsuuid': user_task.task_uuid, 
        'status': user_task.status, 
        'status_hr': user_task.get_status_display()  # human readable status
    }
    return JsonReponse(res, safe=False)

Ваш поток будет, сделать ajax вызов create_taskstatus и использовать возвращенный tsuuid для запросабудьте осторожны, если вы выполняете периодические вызовы для просмотра get_taskstatus, если вы делаете слишком часто, это может привести к перегрузке вашего сервера.

Ваш текущий код задачи должен получить задачу uuid и позаботиться об обновлении. TaskStatus.status значение, чтобы обновить его по своему желанию:

def ajax_call(request, taskuuid):
    user_task = get_user_model().tasks_statuses.get(task_uuid=tsuuid)
    j = 0
    for i in range(1,10000):
        j += i
        if j == 100:
            user_task.status = TaskStatus.STATUS_ONEPERCENT
            user_task.save()
        elif j == 1000:
            user_task.status = TaskStatus.STATUS_TENPERCENT
            user_task.save()
    res = {'data': j}
    return JsonResponse(res, safe=False)

Это всего лишь подход, и вы должны настроить код в соответствии со своими потребностями, я просто надеюсь, что это приведет вас к пути крешение.


С другой стороны, вы можете воспользоватьсяиспользование веб-сокетов и использование каналов django или centrifugo для отправки обновлений на канал в соединении с пользовательским сокетом, но я не буду останавливаться, если вам просто нужна эта функциональность, много накладных расходов здесьтолько для этого.

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