我的客户端有一个Django站点,它使用Page模型来保存静态页面的内容。他们想要一个系统,在对页面进行任何更改之前和之后保存页面的PDF。 (顺便说一下,我正在使用NGINX,主管,Gunicorn,Django)
为了实现这一点,我使用Django pre_和post_save信号处理程序,在保存Page模型的实例之前和之后,调用pdfcrowd来保存静态页面的“屏幕截图”。我的预保存代码如下。
@receiver(pre_save, sender=Page)
def page_pre_save_handler(sender, instance, **kwargs):
url = "%s%s" % (settings.DOMAIN, reverse(instance.name))
fname = '%s_before' % instance.name
fetch_pdf(url, fname)
fetch_pdf函数向pdfcrowd发送url并保存生成的pdf,而post_save方法实际上是相同的。当我通过管理界面更新页面模型时,返回的PDF是502错误,管理员也会转到502。如果我注释掉fetch_pdf()调用并在更新Page对象之前和之后手动使用URL上的PDF人群,它可以正常工作。此外,如果我在page_pre_save_handler中使用不同的域(例如,我们的生产域而不是我正在开发的开发域),它也可以正常工作。
在我的NGINX服务器日志中,我找到了
行upstream timed out (110: Connection timed out) while reading response header from upstream, client: 69.164.218.62
其中69.164.218.62是pdfcrowd.com。我已经提出了超时因素,以确保它们不会造成这种情况。他们不是。
在我的Gunicorn日志中,我发现:
2014-02-12 18:01:47 [7078] [CRITICAL] WORKER TIMEOUT (pid:7083)
2014-02-12 18:01:47 [7078] [CRITICAL] WORKER TIMEOUT (pid:7083)
2014-02-12 18:01:47 [7118] [INFO] Booting worker with pid: 7118
我有3名枪手,我已经开始使用高超时选项开枪了。
所以我认为这个问题与我引入另一个访问正在更新的对象的请求这一事实有关,但即使这样做也没有多大意义,如果前后保存调用实际上保存之前和之后都会发生。所以我很难过。任何想法都会受到赞赏。
谢谢!