gpt4 book ai didi

python - 使用 Django、celery 和 Redis 安排任务

转载 作者:太空宇宙 更新时间:2023-11-04 09:52:03 26 4
gpt4 key购买 nike

我在 Celery 中添加了一个用于数据导出的任务。我希望当用户调用 Export all 按钮时,导出任务开始并且在前端显示一条 django 消息,同时在后台继续导出.但是根据我的能力,我在 views.py 中有这个:

def CasesPaluExport(request):
export_cases_palu.delay(request=request)
messages.success(request, 'CasesPaluExport')
return JsonResponse({"Ok": "ok"}, safe=False)

tasks.py 中:

def export_cases_palu(request):
try:
plaintext = get_template('stock/download_case_palu.txt')
htmly = get_template('stock/download_case_palu.html')
d = Context({'username': request.user.username})

subject, from_email, to = 'Download all cases palu', settings.DEFAULT_FROM_EMAIL, request.user.email
text_content = plaintext.render(d)
html_content = htmly.render(d)
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()
except:
logging.warning("Tried to send download email to user {0}".format(request.user))

问题是每当我调用 CasesPaluExport 函数时,我都会在 export_cases_palu.delay(request=request) 行收到错误:

Internal Server Error: /user/casepaluexport/
Traceback (most recent call last):
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
return view_func(*args, **kwargs)
File "/home/user/project/user/views.py", line 170, in CasesPaluExport
export_cases_palu.delay(request=request)
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/celery/app/task.py", line 413, in delay
return self.apply_async(args, kwargs)
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/celery/app/task.py", line 536, in apply_async
**options
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/celery/app/base.py", line 737, in send_task
amqp.send_task_message(P, name, message, **options)
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/celery/app/amqp.py", line 554, in send_task_message
**properties
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/messaging.py", line 169, in publish
compression, headers)
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/messaging.py", line 252, in _prepare
body) = dumps(body, serializer=serializer)
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/serialization.py", line 221, in dumps
payload = encoder(data)
File "/usr/lib/python2.7/contextlib.py", line 35, in __exit__
self.gen.throw(type, value, traceback)
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/serialization.py", line 54, in _reraise_errors
reraise(wrapper, wrapper(exc), sys.exc_info()[2])
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/serialization.py", line 50, in _reraise_errors
yield
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/serialization.py", line 221, in dumps
payload = encoder(data)
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/utils/json.py", line 72, in dumps
**dict(default_kwargs, **kwargs))
File "/usr/lib/python2.7/json/__init__.py", line 250, in dumps
sort_keys=sort_keys, **kw).encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
File "/home/user/.virtualenvs/project/local/lib/python2.7/site-packages/kombu/utils/json.py", line 62, in default
return super(JSONEncoder, self).default(o)
File "/usr/lib/python2.7/json/encoder.py", line 184, in default
raise TypeError(repr(o) + " is not JSON serializable")
EncodeError: <WSGIRequest: POST '/user/casepaluexport/'> is not JSON serializable
[20/Nov/2017 15:47:56] "POST /user/casepaluexport/ HTTP/1.1" 500 186320

这可能表明服务器仍在等待 http 响应。我该如何解决?

最佳答案

错误告诉您它无法序列化整个请求以将其发送给任务。

但是您在请求中的任务本身中唯一使用的是用户对象。您应该只发送用户 ID,并在任务中获取对象本身。

 export_cases_palu.delay(user_id=request.user.id)

...

def export_cases_palu(user_id):
user = User.objects.get(id=user_id)
d = Context({'username': user.username})

(此外,您不应该像这样将整个任务包装在 try/except 中。)

关于python - 使用 Django、celery 和 Redis 安排任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47393707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com