Kar*_*bhu 7 python django post save
我有一个使用Django的网站.每个帖子都是一个名为Article的对象.我想在保存后检索帖子的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()
Run Code Online (Sandbox Code Playgroud)
它基本上等待20秒(作为测试添加)然后尝试使用其URL检索帖子的HTML,并将请求状态代码写入文件以进行调试.
问题是我在第一次保存时总是获得status = 404,它在第二次和后续保存时都有效.我认为Django的工作方式是:
但后来我应该能够在post_save中检索HTML.我对post_save的理解不正确吗?
补充说明:
虽然这是一个完全错误的方法(*),但问题可能出在数据库事务中。当前线程保存文章,但在此未提交的事务中,您尝试通过另一个线程(通过 Web 服务器)获取这些数据。在这种情况下,这种行为是完全正确的。您需要在通过另一个线程检索之前提交,或者通过其他方式获取 HTML。
(*) 应该在后台异步完成(Celery 或其他更轻量级的异步队列应用程序),或者如果您想获取 HTML,您可以直接调用视图(根据您的视图,您可能必须伪造请求;如果太复杂,您可以创建一个辅助函数来挑选最少的代码来呈现模板)。如果您只需要在保存某些内容后调用第 3 方 API,那么您希望异步执行。如果您不这样做,“save() 代码”的成功将取决于您的连接或第 3 方服务的可用性,并且您将需要在您不会处理交易的地方处理交易;)
| 归档时间: |
|
| 查看次数: |
4578 次 |
| 最近记录: |