>我在没有任何代理的情况下运行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>