datetime.now () в приложении Django работает плохо - PullRequest
6 голосов
/ 19 мая 2009

У меня были некоторые проблемы с приложением Django после его развертывания. Я использую Apache + mod-wsgi на сервере Ubuntu. Через некоторое время после перезагрузки сервера время становится равным примерно 10 часам. Я сделал вид Django, который выглядит так:

def servertime():
  return HttpResponse( datetime.now() )

и после того, как я перезагружаю сервер и проверяю URL, который показывает, что представление сначала выглядит хорошо. Тогда в какой-то момент он иногда дает правильное время, а иногда нет, а позже он всегда дает неправильное время. Хотя время сервера является основным.

Есть какие-нибудь подсказки? Я гуглил без удачи.

Ответы [ 7 ]

6 голосов
/ 19 мая 2009

Могу ли я также увидеть ваш urls.py?

Подобное поведение ставило меня в тупик однажды ...

То, что оказалось, было способом, которым мой urls.py вызывал представление. Python один раз запустил datetime.now () и сохранил его для будущих вызовов, никогда больше не вызывая его. Вот почему разработчикам django пришлось реализовать возможность передачи функции, а не вызова функции, к значению модели по умолчанию, потому что она будет принимать первый вызов функции и использовать его до перезапуска Python.

Ваше поведение звучит так, как будто в первый раз правильно, потому что это первый раз, когда вызывается представление. Иногда это было неправильно, потому что он снова получил ту же дату. Тогда это снова было случайно случайно, потому что ваш apache, вероятно, запустил другой рабочий процесс для него, и сумасшествие, вероятно, происходит, когда вы попадаете в промежуток между тем, какой процесс обрабатывал запрос.

5 голосов
/ 02 июля 2009

Я обнаружил, что перевод wsgi в режим демона работает. Не уверен почему, но это так. Похоже, что некоторые из недавно созданных процессов получают время.

2 голосов
/ 06 декабря 2011

datetime.now (), вероятно, оценивается один раз, когда создается экземпляр вашего класса. Попробуйте удалить круглые скобки, чтобы функция datetime.now была возвращена и затем оценена. У меня была похожая проблема с настройкой значений по умолчанию для моего DateTimeFields и я написал свое решение здесь .

1 голос
/ 12 мая 2010

Django устанавливает часовой пояс системы на основе вашей переменной настройки TIME_ZONE. Это может привести к различным путаницам при запуске нескольких экземпляров Django с разными настройками TIME_ZONE.

Вот что делает Джанго:

os.environ['TZ'] = self.TIME_ZONE

Ответ выше:

«Я обнаружил, что перевод wsgi в режим демона работает»

у меня не работает ...

Я думаю, что больше не буду использовать встроенный в TIME_ZONE django.

1 голос
/ 21 мая 2009

Возможно, сервер оценивает datetime.now () при запуске сервера, попробуйте сделать его ленивым по шаблону или использовать переменную в своем представлении.

Посмотрите на это сообщение в блоге .

0 голосов
/ 06 июня 2013

Попробуйте установить часовой пояс (переменная TIME_ZONE) в settings.py

Это сработало для меня.

0 голосов
/ 20 мая 2009

вам может потребоваться указать тип контента следующим образом:

def servertime():
  return HttpResponse( datetime.now(), content_type="text/plain" )

другая идея:

это может не работать, потому что datetime.now () возвращает объект datetime. Попробуйте это:

def servertime():
  return HttpResponse( str(datetime.now()), content_type="text/plain" )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...