【发布时间】:2014-03-13 04:15:51
【问题描述】:
我有一个使用 Django 的网站。每个帖子都是一个称为文章的对象。我想在保存后检索帖子的 HTML,所以我编写了以下 post_save 钩子:
@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,并将请求状态代码写入文件以进行调试。
问题是我在第一次保存时总是得到状态 = 404,它在第二次和后续保存时确实有效。我认为 Django 的工作方式是按顺序排列的:
- 使用 save() 将实例保存到数据库。此时帖子将获得一个 URL
- 发送 post_save 信号
但是我应该能够在 post_save 中检索 HTML。我对 post_save 的理解有误吗?
添加注释:
- 将此代码放在 save() 方法中不起作用。也不应该。帖子在 save() 方法的末尾添加到数据库中,因此在 save() 结束之前不应有任何 URL。
- 这是在生产站点上,而不是在开发服务器上。
- 我想使用 HTML 中的链接发送“pingbacks”或实际上是webmention。但是我所有的 pingbacks 都被拒绝了,因为该帖子还没有 URL。这是不起作用的最低限度代码。
【问题讨论】:
-
您是否考虑过另一种方法:不使用 HTTP 检索文章,而是直接将文章模板呈现为字符串。见docs.djangoproject.com/en/1.6/ref/templates/api/…
-
我想使用 HTML 中的链接发送“pingbacks”或实际上是webmention。但是我所有的 pingbacks 都被拒绝了,因为该帖子还没有 URL。这是不起作用的最低限度代码。