Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 芹菜任务在django视图中保存pk或id后,向任务传递pk或id后,无法打开模型实例_Database_Django_Celery - Fatal编程技术网

Database 芹菜任务在django视图中保存pk或id后,向任务传递pk或id后,无法打开模型实例

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块,并使用睡眠等待视图完成,该块可以工作,但在站点繁忙时会导致其他问题,并尝试使用手动事务

我有一个django视图,它创建一个用户,然后将user.pk发送到芹菜任务(.delay),以便通过一些我不希望在视图中使用的API调用向用户发送电子邮件,并将用户添加到邮件列表中

保存新的用户实例
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)