我已经使用DRF(Django Rest Framework)设置了一个休息API。其中一个API函数包括创建用户帐户(a.k.a. register)。
一旦用户被创建",我就会向ce芹发送一个任务以发送确认电子邮件。
但是当芹菜工作人员执行任务时,发生了错误:
DoesNotExist:用户匹配查询不存在。
该任务需要用户ID,仅此而已。然后我尝试拨打DB。而现在正是失败了。
在这个时刻,我很确定用户没有在数据库中创建,因为create()方法已经完成。
如果我在我的任务中有睡眠(),它会起作用。
所以我的问题是:
如何在将任务发送到Celery之前确保我的用户已创建到数据库中?
我正在使用Django 1.9.x
更新1
tasks.py
@shared_task(name='users.utils.send_activation_email')
def send_activation_email(url, user_id):
try:
user = User.objects.get(id=user_id)
# ...
except User.DoesNotExist:
# handle exception
serializers.py
def create(self, validated_data):
user_data = validated_data.pop('user')
user = User.objects.create(username=user_data['email'], email=user_data['email'], is_active=False)
user.set_password(user_data['password'])
user.save()
user_profile = user.profile
user_profile.language = get_language() or settings.LANGUAGE_CODE
user_profile.display_name = validated_data['display_name']
user_profile.save()
user_profile.generate_activation_key()
request = self.context['request']
url = request.build_absolute_uri(reverse('user_confirm', kwargs={'activation_key': user.profile.activation_key}))
send_activation_email.delay(url, user.id) # Celery task
subscribe_to_newsletter.delay(user.id, True) # Celery task
return user_profile
更新2
在查看我的设置后,我发现了这个:
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': '*****',
'USER': '*****',
'PASSWORD': '*****',
'HOST': '*****',
'PORT': 5432,
'ATOMIC_REQUESTS': True,
}
}
我已停用 ATOMIC_REQUESTS 并且它有效!
答案 0 :(得分:0)
使用Django信号django.db.models.signals.post_save,在调用模型的save()方法后将信号发送到接收器
from django.contrib.auth.models import User
from django.db.models.signal import post_save
def create_user_callback(sender, **kwargs):
user = kwargs['instance']
if kwargs['created']:
#send email to the user
post_save.connect(create_user_callback, sender=User)