Подтвердить что ты не робот

Django 1.4 как автоматически получить пользовательский часовой пояс от клиента

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

Я попытался добавить это на страницу входа (используя auth.login):

{% get_current_timezone as TIME_ZONE %}

а затем добавьте это в форму входа

<input type="hidden" name="next" value="/redirect/?tz={{ TIME_ZONE }}">

но tz всегда является часовым поясом сервера.

4b9b3361

Ответ 1

Из документации:

Выбор текущего часового пояса

Текущий часовой пояс эквивалент текущего языка для переводов. Однако нет эквивалент HTTP-заголовка Accept-Language, который Django может использовать для автоматически определить часовой пояс пользователя. Вместо этого Django предоставляет функции выбора часового пояса. Используйте их для создания часового пояса логика выбора, которая имеет смысл для вас.

Вы можете попробовать установить cookie часового пояса с помощью javascript, используя функцию getTimezoneOffset или попытайтесь выполнить некоторую геометрию геоида и график времени по местоположению. Вероятно, самым надежным способом было бы попросить пользователя напрямую и сохранить эту информацию в профиле пользователя/сеансе.

Ответ 3

Я вчера искал вчерашнюю игру. В конце концов я собрал приложение Django для того, что предлагает BluesRockAddict выше (например, использовать getTimezoneOffset):

https://github.com/adamcharnock/django-tz-detect

Я надеюсь, что кто-то найдет это полезным.

Ответ 4

Есть хороший APP для django для активации часового пояса https://pypi.python.org/pypi/django-visitor-information-middleware/0.1.0. Которые имеют два промежуточного слоя

TimezoneMiddleware

Второе программное обеспечение активирует часовой пояс для аутентифицированного пользователя.

VisitorInformationMiddleware

Это промежуточное программное обеспечение добавляет следующие ключи в словарь request.visitor:

страна - страна, в которой находится посетитель.

город - город, на котором посетитель находится в

location.timezone - часовой пояс, используемый в местоположении посетителя, основан на

location.unit_system - система единиц, используемая в местоположении посетителя, основана на

user.timezone - часовой пояс текущего пользователя, прошедшего проверку подлинности

user.unit_system - система единиц текущего пользователя, прошедшего проверку подлинности.

cookie_notice - Истинно, если для текущего посетителя должно отображаться уведомление о согласии с файлом cookie.

Note: Location of the user is determined based on the user IP address.

Ответ 5

В настоящее время я создаю класс промежуточного программного обеспечения (по документации Django), в котором я полагаюсь на базу данных geoip MaxMind (http://dev.maxmind.com/geoip/legacy/geolite) и GeoDjango (https://docs.djangoproject.com/en/1.5/ref/contrib/gis/), чтобы извлечь код страны пользователя, а затем динамически установить динамический временной интервал с помощью pytz:

class TimezoneMiddleware(object):


    def __getUserTimeZone(self, request):
        info = IPResolver(request).getGeoInfo()
        return pytz.country_timezones[info['country_code']][0]


    def process_request(self, request):
        try:
            tz = self.__getUserTimeZone(request)
            timezone.activate(tz)
            logger.debug('Time zone "%s" activated' % str(tz))
        except Exception as e:
            logger.error('Unable to set timezone: %s' % str(e))

pytz.country_timezones возвращает коллекцию часовых поясов, доступных для данной страны, поэтому я в основном выбираю первый возвращенный.

IPResolver - это личный класс, который я написал поверх django.contrib.gis.utils.GeoIP