【问题标题】:django 1.4 how to automatically get user's timezone from clientdjango 1.4 如何从客户端自动获取用户的时区
【发布时间】:2012-05-01 10:23:03
【问题描述】:

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

我尝试在登录页面中添加这个(使用auth.login):

{% get_current_timezone as TIME_ZONE %}

然后将其添加到登录表单中

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

tz 始终是服务器的时区。

【问题讨论】:

  • 这在另一个SO question.中被详细讨论(和争论)。

标签: python django timezone


【解决方案1】:

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

【讨论】:

  • 值得注意的是,这可以通过 pip 获得,并且有分步说明。几分钟后我就让它工作了。谢谢!
  • 对性能影响有任何想法吗?尤其是在响应时间方面。
  • django-easy-timezones 使用了一个不再可供下载的过期数据库。请改用 django-easy-timelines-redux。
【解决方案2】:

来自documentation

选择当前时区

当前时区是 相当于翻译的当前语言环境。然而,没有 相当于 Django 可以使用的 Accept-Language HTTP 标头 自动确定用户的时区。相反,Django 提供 时区选择功能。使用它们来构建时区 对您有意义的选择逻辑。

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

【讨论】:

  • 在你尝试使用“geoip 魔法”之前,先看看@Rich 的回答——我只花了几分钟就安装并配置了他的插件。
【解决方案3】:

我昨天正在四处寻找山姆的东西。最后,我最终按照 BluesRockAddict 的建议(即使用 getTimezoneOffset)组装了一个 Django 应用程序:

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

我希望有人觉得这很有用。

【讨论】:

    【解决方案4】:

    有一个不错的 django APP 可以激活时区https://pypi.python.org/pypi/django-visitor-information-middleware/0.1.0。其中有两个中间件

    时区中间件

    中间件为经过身份验证的用户激活时区。

    VisitorInformationMiddleware

    此中间件将以下键添加到 request.visitor 字典中:

    country - 访问者所在的国家/地区。

    city - 访问者所在的城市

    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.
    

    【讨论】:

    • 对性能影响有任何想法吗?尤其是在响应时间方面。
    【解决方案5】:

    我目前创建了一个中间件类(遵循 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之上写的一个个人实用类

    【讨论】:

      猜你喜欢
      • 2013-07-05
      • 2015-01-29
      • 2023-01-13
      • 2014-04-24
      • 1970-01-01
      • 2012-05-05
      • 2013-05-24
      • 1970-01-01
      • 2011-12-06
      相关资源
      最近更新 更多