2010-03-25 2 views
4

Настройка: несколько сайтов на Django на одном и том же множестве серверов, обслуживаемых той же группой процессов Apache. Некоторые сайты - Восточная ТЗ; некоторые из них являются центральными. База данных - это PSQL, работающая на отдельном сервере.Django Timezone Confusion; Postgres и Apache

Когда я начал, я не задумывался о том, как различные сайты будут обрабатывать временные интервалы; Думаю, я видел настройку TIMEZONE в Django и просто подумал, что она «справится с этим». Теперь я вижу трещины.

Первая проблема: часовой пояс, кажется, переворачивается между Восточным и Центральным. Мое понимание этого из поиска на этом сайте заключается в том, что это связано с тем, что os environ var для TZ устанавливается в Apache-процесс, в зависимости от того, на каком сайте Django обрабатывается запрос, и если этот процесс обрабатывает запрос для сайта на другом TZ, часовой пояс неправильный. Я считаю, что решение, которое я нашел здесь, состояло в том, что на сайтах разных часовых поясов должны присутствовать разные группы процессов. Пожалуйста, исправьте, если неправильно.

Вторая проблема: локально в Linux я сделал ./manage.py-сервер с одного из моих сайтов с центральным временем (я нахожусь на востоке). Я создал актив, дата публикации которого была правильно отображена на один час после администратора. Глядя на фактическую запись PostgresSQL, часовой пояс даты публикации по-прежнему отображается как -04. Использует ли Postgres только часовой пояс самого сервера/компьютера и игнорирует любые настройки TZ в Django? Таким образом, все записи, сохраненные на сервере Postgres в восточное время, будут отображаться как -04 или -05 в зависимости от летней экономии?

Если кто-то еще имеет дело с чем-то подобным, совет ценится. Даже если я отделил процессы Apache для центральных сайтов, чтобы их настройки TZ не пересекались, у меня все еще есть проблема Postgres. И тогда мне любопытно; если временная метка PSQL является центральной, а параметр TZ - восточный, скажем, учитывают ли данные datetime поля TZ? т. е. если вы используете datetime.datetime.now(), когда Django установлен в EST, и он возвращает 2:00 PM, тогда у вас есть фильтр содержимого по дате публикации меньше этого результата, будет ли он учитывать TZ только поиск контента, время публикации которого было 1:00 PM CST или ранее?

ответ

2

Вот некоторые подробности о временной зоне обработки в Django и Postgres, но я сильно рекомендуем дело исключительно с UTC на внутреннем интерфейсе и только преобразования в локальной временной зоне в веб-интерфейсе, представляя UTC метку времени для пользователя. В Python вы можете получить текущее время в UTC через datetime.datetime.utcnow(). Я даже поставил свои серверы в часовой пояс UTC, но это не является абсолютно необходимым.

Несколько часовых поясов в Django не работают; см. this ticket. Объекты datetime в стандартной библиотеке Python являются наименее часовыми поясами, и вам нужна библиотека, такая как pytz, чтобы исправить это, но насколько я знаю, Django по-прежнему возвращает наивные объекты datetime, а не те, которые известны в часовом поясе, которые вы можете создать с помощью pytz.

Postgres будет проверить несколько мест для определения часового пояса, в том числе переменной окружения TZ, но TZ должны быть в среде процесса Postgres:

PostgreSQL 8.5.3. Временные зоны

Если часовой пояс не указан в postgresql.conf, ни в качестве параметра командной строки почтмейстер , сервер попытки использовать значение переменной окружения TZ в качестве часового пояса по умолчанию .Если TZ не определено или не любой из имен часовых поясов, известных к PostgreSQL, попытки сервера к определить часовой пояс операционной системы по умолчанию, проверяя поведение C функции библиотеки МестноеВремя(). Часовой пояс по умолчанию: выбран в качестве ближайшего совпадения среди Известные часовые пояса PostgreSQL.