Ошибка типа в / account / элемент последовательности 1: ожидается байтовоподобный объект, найден NoneType - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь загрузить индикатор выполнения согласно инструкциям здесь .

На данный момент это мое мнение.

def progress_view(request):
count_pag = 200
result = hello.tasks.my_task(8,request).delay(1)
context = {'task_id': result.task_id}
return render(request, 'display_progress.html', context={'task_id': result})

Это my tasks.py

@shared_task(bind=True)
def my_task(self, seconds, request):
   progress_recorder = ProgressRecorder(self)
   result = 0
   for i in range(seconds):
      time.sleep(1)
      result += i
      progress_recorder.set_progress(i + 1, seconds)
   return result

Нет проблем при удалении ввода запроса. Но мне нужен какой-то дополнительный ввод в функцию, чтобы выполнить обработку, которую я хочу. Как добавить дополнительные входы в функцию 'my_task' без обратной трассировки, как показано ниже ???

Traceback:

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
35.             response = get_response(request)

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
128.                 response = self.process_exception_by_middleware(e, request)

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/alvintung/rndtwitr/hello/views.py" in account
22.             return progress_view(request)

File "/Users/alvintung/rndtwitr/hello/views.py" in progress_view
33.     result = hello.tasks.my_task(8,request).delay(1)

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/celery.  
/local.py" in __call__
191.         return self._get_current_object()(*a, **kw)

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/celery/app/task.py" in __call__
375.             return self.run(*args, **kwargs)

File "/Users/alvintung/rndtwitr/hello/tasks.py" in my_task
27.         progress_recorder.set_progress(i + 1, seconds)

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/celery_progress/backend.py" in set_progress
40.                 'description': description

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/celery/app/task.py" in update_state
892.         self.backend.store_result(task_id, meta, state)

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/celery/backends/base.py" in store_result
322.                            request=request, **kwargs)

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/celery/backends/base.py" in _store_result
664.         self.set(self.get_key_for_task(task_id), self.encode(meta))

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/celery/backends/base.py" in get_key_for_task
 570.             self.task_keyprefix, key_t(task_id), key_t(key),

Exception Type: TypeError at /account/
Exception Value: sequence item 1: expected a bytes-like object, NoneType found

1 Ответ

0 голосов
/ 18 февраля 2020

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

def progress_view(request):
    count_pag = 200
    result = hello.tasks.my_task.delay(8, request.POST.get("extra_data"))  # assuming POST body contains extra_data input
    context = {'task_id': result.task_id}
    return render(request, 'display_progress.html', context={'task_id': result})

Также обратите внимание, что аргументы, которые вы передаете задаче сельдерея, должны быть сериализуемыми. Таким образом, вы не можете передать объект запроса целиком. Вы должны использовать запрошенные данные из тела POST:

@shared_task(bind=True)
def my_task(self, seconds, extra_data):
   print(extra_data) # data from request body
   progress_recorder = ProgressRecorder(self)
   result = 0
   for i in range(seconds):
      time.sleep(1)
      result += i
      progress_recorder.set_progress(i + 1, seconds)
   return result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...