django 1.4如何从客户端自动获取用户的时区

时间:2012-04-19 20:09:13

标签: python django timezone

我想知道是否有办法从客户端自动检索用户的时区。特别是在登录期间。

我尝试在登录页面中添加此内容(使用auth.login):

{% get_current_timezone as TIME_ZONE %}

然后在登录表单中添加

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

tz始终是服务器的时区。

5 个答案:

答案 0 :(得分:13)

我进一步简化了,你可以在这里插入:https://github.com/Miserlou/django-easy-timezones 要么 http://gun.io/blog/django-easy-timezones/

答案 1 :(得分:11)

来自documentation

  

选择当前时区

     

当前时区是   相当于当前翻译的区域设置。但是,没有   相当于Django可以使用的Accept-Language HTTP标头   自动确定用户的时区。相反,Django提供   时区选择功能。使用它们来构建时区   选择逻辑对你有意义。

您可以尝试使用getTimezoneOffset功能通过javascript设置时区Cookie,或者尝试按位置执行一些geoip魔术并计算时区。可能最可靠的方法是直接询问用户并将此信息保存在用户配置文件/会话中。

答案 2 :(得分:8)

昨天我正在寻找山姆的东西。最后,我最终将Django应用程序整合到BluesRockAddict上面建议的内容中(即使用getTimezoneOffset):

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

我希望有人觉得有用。

答案 3 :(得分:2)

django有一个很好的APP来激活时区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's IP address.

答案 4 :(得分:0)

我目前创建了一个中间件类(遵循Django的文档),我依赖MaxMind geoip数据库(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

之上编写的个人实用工具类