Django Celery发送注册电子邮件不起作用



我正在学习芹菜。在我的网站上,我让人们注册一个帐户。一旦他们创建了一个新帐户,它将自动向他们的用户电子邮件地址发送一封激活电子邮件。

一切都很好,但现在我想使用Celery异步发送电子邮件。

我使用RabbitMQ作为代理,版本3.1.5和Celery 3.1.7(最新版本),因为他们说这个版本不需要djceley。所以我只需要安装Celery。

我按照指示作为芹菜的网站,配置我的django。

proj
--proj/celery.py

这是我的芹菜。py

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
app = Celery('proj')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request:{0!r}'.format(self.request))

这是我放在应用程序文件夹中的任务.py

proj
---proj/celery.py
---app/tasks.py

任务.py

from __future__ import absolute_import
from celery.decorators import task
@task()
def user_send_activation_email(user):
user.send_activation_email()

我在用户模型中添加了send_activation_email功能,这样用户就可以发送电子邮件了。

这是我的视图。py

from django.shortcuts import render_to_response, redirect,render
from django.conf import settings
from django.http import HttpResponse,HttpResponseRedirect,Http404
from django.template import RequestContext
from app.accounts.forms import SignupForm
from django.contrib.auth import get_user_model
from app.sns_utils import generate_sha1 
from app.tasks import user_send_activation_email 
def signup(request):
if request.method=='POST':
form=SignupForm(data=request.POST)
if form.is_valid():
UserModel=get_user_model()
username = form.cleaned_data['username']
email = form.cleaned_data['email']
password = form.cleaned_data['password']
user=UserModel.objects.create_user(username=username,email=email,password=password)
user.activation_key = generate_sha1(username)
user.save()
user_send_activation_email.delay(user=user)

return redirect('/')

下面是我如何在设置中配置Celery。py:

BROKER_URL = 'amqp://guest:guest@localhost:5672//'
CELERY_RESULT_BACKEND = 'amqp://guest:guest@localhost:5672//'
CELERY_TASK_SERIALIZER = 'json'

网站上说,一切都只关注芹菜。

一旦我manage.py runserver,在注册页面中,我用用户名vmuser630注册了一个新帐户,它会显示以下错误:

EncodeError at /accounts/signup/
<MyUser: vmuser630> is not JSON serializable
Request Method: POST
Request URL:    http://localhost:8000/accounts/signup/
Django Version: 1.6
Exception Type: EncodeError
Exception Value:    
<MyUser: vmuser630> is not JSON serializable
Exception Location: C:Python33libjsonencoder.py in default, line 173
Python Executable:  C:Python33python.exe
Python Version: 3.3.2

如果我将其从设置中删除。py

CELERY_TASK_SERIALIZER = 'json'

然后重试manage.py runserver,我被重定向到'/'页面。新帐户在数据库中,但我没有收到激活电子邮件。

看起来发送电子邮件的任务刚刚通过,什么也没发生。

当我将发送电子邮件功能改回:时

user.send_activation_email()

这意味着我不使用芹菜,它有效,我可以获得激活电子邮件。

为什么它显示错误而不是JSON可序列化

Celery需要序列化任务的参数。这里,user是不可序列化的,但您可以将其替换为其ID:

任务中.py

from __future__ import absolute_import
from celery.decorators import task
from django.contrib.auth import get_user_model
@task()
def user_send_activation_email(user_id):
user = get_user_model().objects.get(pk=user_id)
user.send_activation_email()

然后从视图调用它。py使用:

user_send_activation_email.delay(user_id=user.pk)

请参阅settings-task_serializer,您可以在芹菜配置中设置CELERY_task_serializer="pickle"。

相关内容

  • 没有找到相关文章

最新更新