簡體   English   中英

django 1.4 如何從客戶端自動獲取用戶的時區

[英]django 1.4 how to automatically get user's timezone from client

我想知道是否有辦法從客戶端自動檢索用戶的時區。 特別是在登錄期間。

我嘗試在登錄頁面中添加它(使用auth.login ):

{% get_current_timezone as TIME_ZONE %}

然后將其添加到登錄表單中

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

tz始終是服務器的時區。

文檔中

選擇當前時區

當前時區相當於當前翻譯的語言環境。 但是,沒有等效的Django可用於自動確定用戶時區的Accept-Language HTTP標頭。 相反,Django提供了時區選擇功能。 使用它們來構建對您有意義的時區選擇邏輯。

您可以嘗試使用getTimezoneOffset函數通過javascript設置時區cookie,或嘗試做一些geoip魔術並按位置計算時區。 可能最可靠的方法是直接詢問用戶並將此信息保存在用戶個人資料/會話中。

我進一步簡化了它,您可以在這里插入: https : //github.com/Miserlou/django-easy-timezoneshttp://gun.io/blog/django-easy-timezones/

昨天我在尋找山姆。 最后,我最終將BluesRockAddict上面建議的Django應用組合在一起(即使用getTimezoneOffset):

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

我希望有人覺得有用。

django有一個不錯的APP來激活時區https://pypi.python.org/pypi/django-visitor-information-middleware/0.1.0 其中有兩個中間件

時區中間件

中間件為經過身份驗證的用戶激活時區。

訪客信息中間件

該中間件將以下鍵添加到request.visitor詞典中:

國家-訪問者所在的國家/地區。

城市-訪問者所在的城市

location.timezone-位置訪問者中使用的時區基於

location.unit_system-位置訪問者中使用的單位系統基於

user.timezone-當前經過身份驗證的用戶的時區

user.unit_system-當前已認證用戶的單位系統。

cookie_notice-如果應為當前訪問者顯示cookie同意通知,則為true。

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

我目前創建了一個中間件類(遵循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之上編寫的個人實用程序類

我只是在我的程序中這樣做了。 在我的 js 中:

<script> 
  var today = new Date()
  var offset = today.getTimezoneOffset()
  const serializedData = 'csrfmiddlewaretoken={{ csrf_token }}&tz_offset= ' 
  + offset.toString() 
</script>

然后在 django 端:

def your_function(request):
    tz_offset = request.POST.get('tz_offset')
    now = datetime.datetime.now() - timedelta(minutes=int(tz_offset))
    return now

我將 serializedData 傳遞給 POST 請求,然后在我的 function 中訪問它

<script>
   function update_transaction(serializedData){
    $.post('{% url "your_url" %}', serializedData, function(data){
        //do stuff
    });
}
</script>

 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM