我在我的 Web 应用程序中同时使用 Django、uWSGI 和 nginx。我遇到一个奇怪的问题,预填充今天日期的 DateField 卡在今天之前的日期。我已经将它缩小到我上次重启 uWSGI 守护进程的日期。如果我重新启动守护程序并刷新页面,它会立即修复,但如果我明天重新访问该页面,它就会有今天的日期。
我认为 uWSGI 和 nginx 都没有默认启用任何缓存。
我不会费心包括 nginx 配置,因为我不认为这是相关的,但这是我的 uwsgi 配置:
[uwsgi]
chdir=/home/nick/django-prod/budget
pythonpath=..
socket=/home/nick/django-prod/uwsgi/uwsgi.sock
module=budget.wsgi
wsgi-file=/home/nick/django-prod/budget/wsgi.py
master=True
pidfile=/tmp/project-master.pid
vacuum=True
uid=www-data
gid=www-data
max-requests=5000
daemonize=/var/log/uwsgi/budget.log
我相信这可能不太相关,但无论如何我都会把它包括在这里,这是我用作日期选择器字段的自定义小部件,它覆盖了内置的 DateField:
class JDatePickerWidget(forms.DateInput):
def __init__(self, attrs=None, format='%m/%d/%Y'):
super(JDatePickerWidget, self).__init__(attrs)
self.format = format
def render(self, name, value, attrs=None):
if value is None:
value = ''
final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
if value != '':
# Only add the 'value' attribute if a value is non-empty.
final_attrs['value'] = force_text(self._format_value(value))
return_string = mark_safe(u'''<script type="text/javascript">
$(function() { $( '#%s' ).datepicker({ dateFormat: 'mm/dd/yy'}); });
</script>''' % final_attrs['id'])
return_string = return_string + format_html('<input{0} />', flatatt(fin$
return return_string
class JDatePicker(forms.DateField):
widget = JDatePickerWidget
class JDatePickerField(models.DateField):
def formfield(self, **kwargs):
defaults = {'form_class': JDatePicker}
defaults.update(kwargs)
return super(JDatePickerField, self).formfield(**defaults)
如何阻止这种缓存发生,以便在我重新访问页面时刷新默认字段值?
请您参考如下方法:
您没有发布您的表单代码,所以这主要是一个大胆的猜测,但这种问题通常来自通过调用 datetime 初始化您的表单字段之一.datetime.now() (或查询集或其他)。由于顶级代码(类主体级语句是其中的一部分)仅在导入时执行一次,因此您有陈旧的值。
(编辑)从您下面的评论来看,您的问题来自于在您的模型字段之一中使用 default=datetime.datetime.now()。您想要传递可调用函数,即 default=datetime.datetime.now(无括号),如此处所述:https://docs.djangoproject.com/en/1.6/ref/models/fields/#default
