0

我的一个网站有一个相当奇怪的问题。我有一个 Django 站点(使用 uWSGI 和 NGINX)和一个 celery 实例。celery 和站点都是通过 supervisord 管理的。

我的 settings.py 文件中有以下设置:

DATE_INPUT_FORMATS = (
    '%d/%m/%Y',
    '%Y-%m-%d',
)

但是,如果其中一个 celery 任务抛出错误(或者它似乎与发生这种情况的时间一致),突然当我在网站上的表单中输入日期时,它会说这是一个无效的日期。

我在任何地方都找不到有关此的任何信息。有谁知道为什么会发生这种情况?

4

1 回答 1

1

我们遇到了类似的问题,这让我发疯,我已经解决了,但我找不到重现该错误的原因或模式。

我们也DATE_INPUT_FORMATS对设置进行了定义,并且验证按预期工作。现在我们正在将一个导致 Bad Gateways 的重要特性转移到 celery 任务中,并且某些表单将在任务中被初始化。第一天测试一切正常,但昨天我们遇到了一些问题。

我们有两个DateField表单,格式相同,有时其中一个会引发验证错误。我找不到任何日期模式;每次我重新加载页面,选择日期并启动任务时,即使选择相同的日期,行为似乎也会有所不同(有时会得到验证,有时不会)。如果我pdb在调用任务之前使用并手动初始化表单,它会被正确验证。我还检查了任务中的表单数据是否完全相同,所以问题一定与Celery设置有关DATE_INPUT_FORMATS

最终我通过input_formats在表单的有问题的字段上定义可选参数来解决它:

class DateFilterForm(forms.Form): date_from = forms.DateField( widget=forms.DateInput( format='%d/%m/%Y', attrs={'class': 'date_input'} ) ) date_to = forms.DateField( input_formats = ['%d/%m/%Y'], widget=forms.DateInput( format='%d/%m/%Y', attrs={'class': 'date_input'} ) )

这样它总是可以正常工作,尽管我无法弄清楚它背后的逻辑。我们当前的环境使用Django==1.4.16and celery==2.5.1,如果有人感兴趣的话(我们希望尽快升级,所以我会检查这是否解决了原来的问题)。

于 2016-04-01T15:22:28.503 回答