2014-01-07 64 views
1

我在我的web應用程序上一起使用Django,uWSGI和nginx。我有一個奇怪的問題,即預填有今天日期的DateField在今天之前的某個日期卡住了。我已縮小到我上次重新啓動uWSGI守護程序的日期。如果我重新啓動守護程序並刷新頁面,它會立即修復,但如果我明天再次訪問該頁面,它將具有今天的日期。Django + uWSGI + nginx =奇怪的緩存?

我認爲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) 

如何從發生停止此緩存,以便默認字段值會被刷新當我重新審視頁面?

回答

3

你沒有張貼窗體的代碼,所以這主要是胡亂猜測,但這種問題通常來自初始化您形式的領域之一,通過調用datetime.datetime.now()(或一個QuerySet或什麼)。由於頂級代碼(哪些類 - 主體級別語句是其中的一部分)僅在導入時執行一次,因此您有過時的值。

(編輯)從您的評論如下,您的問題來自您的模型的一個領域使用default=datetime.datetime.now()。您想要傳遞可調用對象,例如:default=datetime.datetime.now(無parens),如下所示:https://docs.djangoproject.com/en/1.6/ref/models/fields/#default

+0

我在我的模型定義中實際使用了'datetime.datetime.now()'。我想修復會改變它,所以沒有'default ='值,而是在模板本身中呈現日期? – trpt4him

+1

好的,將它作爲'models.Field'的默認值會產生同樣的問題。在這種情況下,解決方案 - 作爲文檔https://docs.djangoproject.com/en/1.6/ref/models/fields/#default - 將傳遞一個可調用對象,而不是調用可調用對象的結果。 IOW:用'default = datetime.datetime.now'替換'default = datetime.datetime.now()'(沒有parens)。 –

+0

啊,這是重要的部分:「如果可調用,每次創建新對象時都會調用它。」現在就工作,謝謝! – trpt4him