我的某个网站遇到了一个相当奇怪的问题。 我有一个Django站点(使用uWSGI和NGINX)和一个芹菜实例。 芹菜和网站都是通过supervisord管理的。
我在settings.py文件中有以下设置:
DATE_INPUT_FORMATS = (
'%d/%m/%Y',
'%Y-%m-%d',
)
但是,如果其中一个芹菜任务抛出错误(或者它似乎与发生的情况一致),突然当我在网站上的表单中输入日期时,它表示这是一个无效的日期。
我无法在任何地方找到任何相关信息。 有谁知道为什么会发生这种情况?
答案 0 :(得分:1)
我们遇到了类似的问题并且让我发疯,我已经解决了这个问题,但我找不到原因,也没有找到重现错误的模式。
我们也在设置中定义了DATE_INPUT_FORMATS
,验证工作正常。现在我们正在移动一个重要的功能,导致Bad Gateways进入芹菜任务,并且某个表单将在任务内部初始化。测试的第一天工作正常,但昨天我们遇到了一些问题。
我们在表单中有两个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.16
和celery==2.5.1
,如果有人有兴趣(我们希望尽快升级,所以我会检查是否能解决原始问题)。