Database 芹菜任务在django视图中保存pk或id后,向任务传递pk或id后,无法打开模型实例
我有一个django视图,它创建一个用户,然后将user.pk发送到芹菜任务(.delay),以便通过一些我不希望在视图中使用的API调用向用户发送电子邮件,并将用户添加到邮件列表中 保存新的用户实例Database 芹菜任务在django视图中保存pk或id后,向任务传递pk或id后,无法打开模型实例,database,django,celery,Database,Django,Celery,我有一个django视图,它创建一个用户,然后将user.pk发送到芹菜任务(.delay),以便通过一些我不希望在视图中使用的API调用向用户发送电子邮件,并将用户添加到邮件列表中 保存新的用户实例user.save()后,我将user.pk发送给芹菜任务email\u user\u task.delay(user.pk),但芹菜任务失败,错误是用户不存在 我曾尝试在芹菜任务中添加一个try-except块,并使用睡眠等待视图完成,该块可以工作,但在站点繁忙时会导致其他问题,并尝试使用手动事务
user.save()
后,我将user.pk
发送给芹菜任务email\u user\u task.delay(user.pk)
,但芹菜任务失败,错误是用户不存在
我曾尝试在芹菜任务中添加一个try-except块,并使用睡眠等待视图完成,该块可以工作,但在站点繁忙时会导致其他问题,并尝试使用手动事务提交,但遇到其他错误,我认为这应该可以工作
@render_to('signup.html')
def signup(request):
if request.method == "POST":
form = SignupForm(request.POST, request=request)
if form.is_valid():
new_user = form.save(commit=False)
new_user.email = form.cleaned_data["email"]
new_user.fist_name = form.cleaned_data["first_name"]
new_user.last_name = form.cleaned_data["last_name"]
new_user.save()
email_user_task.delay(new_user.pk) # this cannot get the User from the pk
HttpResponseRedirect(reverse("signup_complete"))
else:
form = SignupForm(request=request)
return locals()
这个芹菜任务爆炸了:
@task
def email_user_task(user_pk):
user = User.objects.get(pk=user_pk) # this yeilds a User.DoesNotExist error
我的第一个解决方案有效,除非5秒不够:
def email_user_task(user_pk):
try:
user = User.objects.get(pk=user_pk)
except User.DoesNotExist:
import time
time.sleep(5)
user = User.objects.get(pk=user_pk) # this works I'm guessing after the view finishes
我错过了什么?i、 e.为什么
新用户.save()在调用芹菜任务之前没有写入数据库?我也有同样的问题,试试这个
@render_to('signup.html')
def signup(request):
if request.method == "POST":
form = SignupForm(request.POST, request=request)
if form.is_valid():
new_user = form.save(commit=False)
new_user.email = form.cleaned_data["email"]
new_user.fist_name = form.cleaned_data["first_name"]
new_user.last_name = form.cleaned_data["last_name"]
if new_user.save():
email_user_task.delay(new_user.pk) # this cannot get the User from the pk
HttpResponseRedirect(reverse("signup_complete"))
else:
form = SignupForm(request=request)
return locals()
由于用户对象在查看事务中被锁定,并且不想干扰事务以确保在芹菜任务尝试访问它之前将其保存,因此我将所有相关参数传递给芹菜任务,以便它可以发送电子邮件
i、 e
您是否查看了数据库并查看了用户是否确实是创建的?另外,芹菜进程和django进程实际上是在看同一个数据库吗?是的,这就是为什么修复程序可以添加睡眠。我还禁用了所有本地缓存并使其无效,以便进行测试。啊,对不起。误读了。您有没有在Django应用程序中启用过?我认为原子请求仅在dev Django版本中,new\u user
model save方法是自定义的?因为django的默认模型保存方法实际上不返回任何内容。任务真的开始了吗?
email_user_task.delay(new_user.first_name, new_user.email)