如何在http响应(django服务器)中更改时区



>我在没有任何代理的情况下运行django服务器:

python manage.py runserver 0.0.0.0:80

我在 linux 服务器上设置了本地时区,这是正确的:

root@83b3bf90b5c5:/app# date
Fri Apr  7 12:38:42 MSK 2017

我还在我的 django 项目 settings.py 设置了本地时区:

TIME_ZONE = 'Europe/Moscow'

并检查了一下:

>>> from django.utils.timezone import localtime, now
>>> localtime(now())
datetime.datetime(2017, 4, 7, 12, 38, 42, 196476, 
tzinfo=<DstTzInfo 'Europe/Moscow' MSK+3:00:00 STD>)

但是当我从客户端(谷歌浏览器(打开任何网页时 - 在 http 响应标头中时区不是本地的:

Date:Fri, 07 Apr 2017 09:38:42 GMT

如何在全局所有项目的 http 标头中更改时区?

如何在全局所有项目的 http 标头中更改时区?

HTTP 日期标头被定义为 UTC(由于历史原因由字符 GMT 表示(,因此 Django 或任何其他服务器或框架都不允许您将它们本地化到您的时区。你想这样做有什么原因吗?

Django 确实有切换到本地时区的方法(参见 activate(((,但这仅适用于特定于应用程序的内容,而不是 HTTP 标头。

使用 pytz 作为astimezone方法

from pytz import timezone
time_zone = timezone(settings.TIME_ZONE)
currentTime = currentTime.astimezone(time_zone)

在中间件中:

import pytz
from django.utils import timezone
from django.utils.deprecation import MiddlewareMixin
class TimezoneMiddleware(MiddlewareMixin):
    def process_request(self, request):
        tzname = request.session.get('django_timezone')
        if tzname:
            timezone.activate(pytz.timezone(tzname))
        else:
            timezone.deactivate()

在你的 view.py

from django.shortcuts import redirect, render
def set_timezone(request):
    if request.method == 'POST':
        request.session['django_timezone'] = request.POST['timezone']
        return redirect('/')
    else:
        return render(request, 'template.html', {'timezones': pytz.common_timezones})

在你的寺庙里.html

{% load tz %}
{% get_current_timezone as TIME_ZONE %}
<form action="{% url 'set_timezone' %}" method="POST">
    {% csrf_token %}
    <label for="timezone">Time zone:</label>
    <select name="timezone">
        {% for tz in timezones %}
        <option value="{{ tz }}"{% if tz == TIME_ZONE %} selected="selected"{% endif %}>{{ tz }}</option>
        {% endfor %}
    </select>
    <input type="submit" value="Set" />
</form>

相关内容

  • 没有找到相关文章

最新更新