Skip to main content
 首页 » 编程设计

python之Django + uWSGI + nginx = 奇怪的缓存

2024年08月28日31lexus

我在我的 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