django - 芹菜工人没有收到任务

django -celery worker not receiving tasks

我正在尝试通过 Django celery 发送电子邮件,但 celery 未收到任务。

settings.py

CELERY_BROKER_URL = 'redis://127.0.0.1:6379'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = "UTC"

tasks.py

@app.task(name="send_activation_email")
def send_activation_email(user):
    
    to = user.email
    user_id = user.id
    subject = 'Activate Your %s Account' % user.get_user_role_display()
    text_content = ''
    uid = urlsafe_base64_encode(
        force_bytes(user_id))

    token = account_activation_token.make_token(user)
    c = ({'user': user,
          'user_type': user.user_role,
          'base_url': base_url, 'token': token, 'uid': uid, 'text_content': text_content})
    html_content = get_template('mail/user/invite.html').render(c)
    msg = EmailMultiAlternatives(
        subject, text_content, from_email, [to])
    msg.attach_alternative(html_content, "text/html")
    msg.send()

views.py

class SignUpView(generics.ListAPIView):
    authentication_classes = ()
    permission_classes = ()
    renderer_classes = (JSONRenderer, )

    def post(self, request, user_role="employee",format=None, version=None):
        user = UsersSerializer(data=request.data,context={"user_role": user_role})
        if user.is_valid():
            t_user = user.save()
            send_activation_email.delay(t_user)
            message_data = custom_http_messages(
                code=200, message='You have successfully created your account.',data=user.data)
            return Response(message_data, status=message_data['code'])        
        else:
            message_data = custom_http_messages(
                    code=400, message='', data=user.errors)
            return Response(message_data, status=message_data['code'])

获取错误

它在没有 .delay 函数的情况下工作,即没有芹菜。芹菜终端也没有收到任何任务。

t_userUser 类型。当芹菜通过代理启动任务时,它必须序列化任务所需的所有参数,以便任务(可能在不同的服务器上)可以从代理反序列化其参数并以无状态方式对其进行操作。

您看到的错误是因为 celery 不知道如何将 t_user 实例序列化为 json。您可以执行以下两项操作之一:修改生产者和消费者以在 json 序列化 User 字典上运行,或者修改 task_serializeraccept_content 设置以包含 pickle.

当然,如果不受信任的生产者应用程序可以通过向代理发出任务请求来启动任务,则使用 pickle 会引入安全问题。如果您不关心不受信任的生产者的问题,您应该是相当安全的(但您可能想要阅读使用 pickle 可能容易受到影响的所有漏洞)。

您可以在 celery 文档(提供的链接)中阅读有关 accept_content and task_serializer 的更多信息。