вы не можете отобразить каждое значение 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 для отправки обновлений на канал в соединении с пользовательским сокетом, но я не буду останавливаться, если вам просто нужна эта функциональность, много накладных расходов здесьтолько для этого.