gpt4 book ai didi

python - 为什么我可以在它的 post_save 信号期间访问一个对象,但是当我在该信号中触发在另一个进程上调用它的代码时却不能

转载 作者:太空狗 更新时间:2023-10-29 17:12:04 26 4
gpt4 key购买 nike

所有,我对 Django 信号有疑问。

我有一个模型为了加快页面加载的响应速度,我正在卸载一些必须完成的密集处理,方法是调用我们正在运行的第二个本地主机网络服务器,两者都使用相同的数据库。我看到调用进程可以检索对象但被调用进程不能的行为。端口 80 和端口 [port] 都指向在同一个数据库上运行的 django 进程。

在 models.py 中

class A(models.Model):
stuff...

def trigger_on_post_save( sender, instance, create, raw, **keywords):
#This line works
A.objects.get( pk=instance.pk )
#then we call this
urlopen( r'http://127.0.0.1:[port]' +
reverse(some_view_url, args(instance_pk) ).read()

post_save.connect( trigger_on_post_save, A )

在 views.py 中

def some_view_function( request, a_pk ):
#This line raises an object_not_found exception
A.objects.get( pk=a_pk )

此外,urlopen调用抛出异常后,数据库中不存在该对象。据我了解,post_save 是在对象保存并写入数据库后调用的。这是不正确的吗?

最佳答案

我们遇到了类似的问题,最终使用了 on_commit callback (注意:这仅适用于 Django >= 1.9)。所以,你可以这样做:

from django.db import transaction

class A(models.Model):
stuff...

def trigger_on_post_save( sender, instance, create, raw, **keywords):
def on_commit():
urlopen(r'http://127.0.0.1:[port]' +
reverse(some_view_url, args(instance_pk) ).read()
transaction.on_commit(on_commit)

post_save.connect( trigger_on_post_save, A )

这里的想法是您将在事务提交后调用您的端点,因此事务中涉及的实例将已经保存;)。

关于python - 为什么我可以在它的 post_save 信号期间访问一个对象,但是当我在该信号中触发在另一个进程上调用它的代码时却不能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8528264/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com