首页 > 解决方案 > /account/ 序列项 1 处的 TypeError:期望一个类似字节的对象,找到 NoneType

问题描述

我正在尝试按照此处的说明加载进度条。

目前这是我的看法。

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})

这是我的任务.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

标签: django

解决方案


您不需要直接调用任务函数。要在后台运行它,您应该在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})

另请注意,您传递给 celery 任务的参数应该是可序列化的。所以你不能将完整的请求对象传递给任务。您应该使用 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

推荐阅读