gpt4 book ai didi

python - 将实例保存到数据库之前/之后是否触发了 Django post_save?

转载 作者:太空狗 更新时间:2023-10-30 00:11:11 26 4
gpt4 key购买 nike

我有一个使用 Django 的网站。每个帖子都是一个名为 Article 的对象。我想在保存后检索帖子的 HTML,所以我编写了以下 post_save 钩子(Hook):

@receiver(models.signals.post_save, sender=Article)
def _send_article_mentions(sender, instance, **kwargs):
import requests
from django.contrib.sites.models import Site
from urlparse import urljoin
from ParallelTransport.settings import ARTICLES_URL
SITE_URL = 'http://'+Site.objects.get_current().domain
article_url = urljoin( SITE_URL, instance.get_absolute_url() )
import time
time.sleep(20)
r = requests.get(article_url)
error_file = open(ARTICLES_URL+'/'+'error.txt','w')
error_file.write('file started1\n')

m = r.status_code
error_file.write(str(m))
error_file.close()

它基本上等待 20 秒(作为测试添加),然后尝试使用其 URL 检索帖子的 HTML,并将请求状态代码写入文件以进行调试。

问题是我总是在第一次保存时得到 status = 404,它在第二次和随后的保存中起作用。我认为 Django 的工作方式是这样的:

  1. 使用 save() 将实例保存到数据库。此时帖子将获得一个 URL
  2. 发送post_save信号

但是我应该能够在 post_save 中检索 HTML。我对 post_save 的理解有误吗?

添加注释:

  1. 将这段代码放在 save() 方法中是行不通的。也不应该。帖子在 save() 方法结束时添加到数据库中,因此在 save() 结束之前不应有任何 URL。
  2. 这是在生产站点上,而不是在开发服务器上。
  3. 我想使用 HTML 中的链接发送“pingbacks”或者实际上是 webmention .但是我所有的 pingbacks 都被拒绝了,因为帖子还没有 URL。这是不起作用的最低限度代码。

最佳答案

虽然这是一个完全错误的方法(*),但问题可能出在数据库事务中。当前线程保存文章,但在这个未提交的事务中,您试图通过另一个线程(通过 Web 服务器)获取这些数据。在那种情况下,这种行为是完全正确的。您要么需要在通过另一个线程检索之前提交,要么通过其他方式获取 HTML。

(*) 应该在后台异步完成(Celery 或其他更轻量级的异步队列应用程序),或者如果你想获取 HTML,你可以直接调用 View (根据你的 View ,你可能必须伪造请求; 如果太复杂,您可以创建一个辅助函数,它会挑选最少的代码来呈现模板)。如果您只需要在保存内容后调用第 3 方 API,则需要异步执行。如果你不这样做,你的“保存()代码”的成功将取决于你的连接或第三方服务的可用性,你将需要在你不会处理交易的地方处理交易;)

关于python - 将实例保存到数据库之前/之后是否触发了 Django post_save?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21768577/

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