django - /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
解决方案
您不需要直接调用任务函数。要在后台运行它,您应该在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
推荐阅读
- python - 运行爬虫时没有反馈
- reactjs - 无法将 Material-ui withStyles() 与 react-beautiful-dnd 一起使用
- vba - 引用 UDF 中的特定单元格
- android-camera2 - 访问被拒绝查找属性“persist.camera.cfa.packagelist”
- audiokit - 使用AKPlayer按顺序播放随机音频文件
- c# - 在运行时使用接口动态转换/包装委托到签名
- windows - 需要一种解决方案来在理想的时间启动程序并在每天理想的时间自动关闭它
- javascript - 例如,我如何创建一个规则,使所有 id 以“At”结尾
- c# - 应用程序在从 Google 获取用户个人资料时停止响应
- javascript - 将 Emojione 与 tinymce 一起使用