2014-01-07 3 views
1

Я использую 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

Вы не отправлял код вашей формы, так что это в основном дикая догадка, но такого рода проблемы, как правило, происходит от инициализации одного из ваших форм «s полей с вызовом datetime.datetime.now() (или к QuerySet или любой другой). Так как код верхнего уровня (который является составным элементом уровня класса) выполняется только один раз во время импорта, у вас есть устаревшие значения.

(изменить) Из вашего комментария ниже ваша проблема возникает с использованием default=datetime.datetime.now() в вашем поле вашей модели. Вы хотите передать вызываемый вместо этого, то есть default=datetime.datetime.now (no 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' (без парнеров). –

+0

Ах, это важная часть: «Если вызываемая она будет вызываться каждый раз, когда создается новый объект». Работает сейчас, спасибо! – trpt4him

Смежные вопросы