2016-10-05 9 views
0

КодексИспользование DateTime.Now() ввиду Джанго

Я использую DateTime.Now() как часть фильтра в представлении Django следующим образом:

def get_now(): 
    return timezone.now() 

class BulletinListView(ListView): 
    model = Announcement 
    template_name = 'newswire/home.html' 

    def get_context_data(self, **kwargs): 
     context = super(BulletinListView, self).get_context_data(**kwargs) 

     try: 
      published_announcements = Announcement.objects.filter(publish_start_date__lte=get_now(), publish_end_date__gte=get_now()).filter(hidden=False, under_review=False).extra(order_by=['-publish_start_date', 'publish_end_date']) 
     except Announcement.DoesNotExist: 
      published_announcements = None 

     if published_announcements is not None: 
      context['announcements'] = published_announcements 
      max_print_annoucements = int(config.MAX_PRINT_ANNOUCEMENTS) 
      context['announcements_print'] = published_announcements[ 
       :max_print_annoucements] 
      context['more_annoucements_online_count'] = published_announcements.count() - max_print_annoucements 

     return context 

Edit: Удалено, чтобы обновить и включить дополнительный код

Он работает правильно и получает объявления, которые должны быть опубликованы и не скрыты или не рассматриваются в соответствии с датой, предоставленной.

Проблема

Я использую datetime.datetime.now() отфильтровать старые объявления, но я понял, после того, как один день в производственной среде, что datetime.datetime.now() в настоящее время оценивается только тогда, когда сервер запускается и значение не обновляется каждый раз, когда в вид, который приводит к тому, что неправильные данные фильтруются, когда наступает следующий день. Это также влияет на другую функцию, которая восстанавливает предстоящие дни рождения в течение следующих 7 дней.

вещей Читаем и Пытался

Я видел ряд вопросов об использовании вызываемой datetime.now вместо datetime.now(), но только в контексте установки значений по умолчанию в модели.

Я определил функцию следующим образом, подумав, что она заставит datetime.now снова оценить, но она не работает.

def get_now(): 
    return timezone.now()) 

Когда я прохожу дату я получить контекст, чтобы увидеть, что я получаю, я вижу, что дата и время не продвигается мимо время я развертывания сервера.

Я видел несколько примеров использования datetime.now() в представлении, но никто не сталкивался с этой проблемой.

Я подозреваю, что я никогда не видел этого в разработке, потому что я запускаю сервер разработки для пушки с параметром --reload и datetime.now() постоянно оценивается при сохранении изменений и перезагрузке сервера.

This problem, кажется, похожи, но я не уверен, как это похоже/отличается от моей ситуации

Контекст:

Я пишу приложение Django, и мои разработки и производственная среда реализуется с помощью докер и запустить приложение позади Nginx прокси

/usr/local/bin/gunicorn app.wsgi:application -w 2 -b :8000 
+1

«, но я понял, после того, как один день в производственной среде, datetime.datetime.now() в настоящее время оценивается только тогда, когда сервер запускается, и значение не обновляется каждый раз, когда вид называется «Не так». Вероятно, у вас есть испорченная настройка кэширования. – e4c5

+0

В стороне, серверы, которые могут обрабатывать запросы по часовым поясам, скорее всего, будут использовать универсальное время через 'datetime.utcnow()'. – tdelaney

+0

@ e4c5 Я дам стек снова для любого кэширования, но из моего файла настроек Django я не определил никакого кэширования. – purplecowww

ответ

0

значение не обновляется каждый раз, т он вид называется что приводит в неправильных данных фильтруются, когда на следующий день приходит

Вы должны решить, что «на следующий день» вы говорите?Это:

  1. На следующий день пользователь посетит ваш сайт.
  2. На следующий день для вас, посетив сайт.
  3. На следующий день для часового пояса, установленного на сервере.

Каждый из них будет иметь «неправильный» результат, когда на самом деле ничего не происходит с кодом.

Это потому, что ваш код наивен, когда речь идет о часовых поясах. Он в основном игнорирует часовые пояса полностью.

Это сложная тема, и у django есть complete section of the manual, посвященный работе с часовыми поясами. Я предлагаю прочитать его один или два раза, так как есть много способов, которые могут повлиять на ваш сайт.

Наконец, вы можете очистить ваш код немного, как это:

try: 
    max_print_annoucements = int(config.MAX_PRINT_ANNOUCEMENTS) 
except ValueError: 
    max_print_announcements = 0 

published_announcements = Announcement.objects.filter(publish_start_date__lte=get_now(), 
                 publish_end_date__gte=get_now()) 
               .filter(hidden=False, under_review=False) 
               .extra(order_by=['-publish_start_date', 
                   'publish_end_date']) 

context['announcements'] = published_announcements 
context['announcements_print'] = published_announcements[:max_print_annoucements] 
context['more_annoucements_online_count'] = abs(published_announcements.count() - max_print_annoucements) 
+0

«Когда наступает следующий день», буквально означает, что когда я загружаю страницу на следующий день, datetime.now() должен действительно отражать текущую дату/время, но все же это время, когда я развернул контейнеры в производство. На самом деле я не думаю, что проблема имеет какое-либо отношение к часовым поясам. Я сделал 'context ['now'] = get_now()' и отобразил его в шаблоне, используя '{{now | date:" lg: i A, j F o "}}', и он показывает, что дата/время в основном просто застрял в то время, когда я развернул сервер на производстве. Что-то не так с этим? – purplecowww

+0

Если сервер не работает на вашем локальном компьютере, скорее всего, ваш следующий день и следующий день для сервера разные. –