阿帕奇时间发行

2024-04-19 07:49:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前有一个使用cookie会话的django站点。我注意到会话是随机注销的。当调试这个时,我发现这是由于我的代码中的逻辑查看了会话的年龄。 然而,我随后注意到,在没有问题的时段内,Apache时间戳中显示的时间是正确的。但后来tiemstamp回到了5个小时后,我的Django程序认为会话已经过期并注销。在

下面是一个例子

[Wed Jul 31 16:12:45 2013] [error] DEBUG ok elapsed time 7
[Wed Jul 31 16:12:45 2013] [error] DEBUG ok elapsed time 1
[Wed Jul 31 10:12:46 2013] [error] DEBUG : request.user.is_authenticated()
[Wed Jul 31 10:12:46 2013] [error] DEBUG ok elapsed time 64809
[Wed Jul 31 10:12:46 2013] [error] DEBUG  since begin . elapsedTime.seconds 64809
[Wed Jul 31 10:12:46 2013] [error] DEBUG request.session\\['deginRequest'\\]
[Wed Jul 31 10:12:46 2013] [error] DEBUG ok elapsed time 64801
[Wed Jul 31 10:12:46 2013] [error] DEBUG  since last req . elapsedTime.seconds 64801
[Wed Jul 31 10:12:46 2013] [error] DEBUG request.session\\['lastRequest'\\]
[Wed Jul 31 10:12:47 2013] [error] DEBUG : shouldLogout

这个问题也会随机发生。有什么想法吗?在

这里还有Im使用的中间件(它生成这些日志)

^{pr2}$

Tags: djangodebugtimecookierequestsession时间ok
3条回答

这似乎是操作系统/硬件配置错误。在

我怀疑有些时候你的网络出现故障,操作系统需要从硬件时钟获取数据,而不是ntp。在

您应该确保BIOS时钟UTC配置与/etc/default/rcS参数匹配:

# assume that the BIOS clock is set to UTC time (recommended)
UTC=no

另外,请确保时区配置正确:

^{pr2}$

一些简单的测试:

  • 启动没有ntp的机器。如果系统数据不正确,请尝试更改UTC参数。在
  • 使用hwclock命令:

样品:

root@egg-v3:/etc# hwclock 
Fri 02 Aug 2013 04:30:54 PM CEST  -0.609670 seconds
root@egg-v3:/etc# date
Fri Aug  2 14:30:55 CEST 2013

Apache日志显示了一个非常离散的5小时时间步长,因此这不太可能是由时间保持守护进程(如ntp)进行的底层系统时间调整。我想这几乎肯定与时区设置有关。在

如果您使用mod wsgi以非守护程序模式为应用程序提供服务,那么环境中的进程之间可能存在共享状态。尤其要注意以下链接中的信息:https://code.google.com/p/modwsgi/wiki/ApplicationIssues#Timezone_and_Locale_Settings

正如其他答案中建议的那样,最好始终以UTC存储时间,并且只转换为特定的时区更新演示文稿。在

考虑在wsgi守护程序模式下运行应用程序。从mod_wsgi docs

Although embedded mode can technically perform better, daemon mode would generally be the safest choice to use.

守护程序模式确保您有一个独立的进程来处理您的应用程序,而不会受到其他wsgi进程的环境污染。例如TZ环境变量变化。在

这也许不能解决你的问题,但值得一提。把这些放在评论里看起来不太合适。在


使用可识别时区的datetime对象而不是天真的对象(datetime.datetime.now()提供了这一点)

在处理日期/时间时使用datetime.datetime.utcnow(),而不是{}。在

所以从django timezones

import datetime
from django.utils.timezone import utc

now = datetime.datetime.utcnow().replace(tzinfo=utc)

当django将存储在request.session['beginSession']中的时间从原始对象错误地转换为支持时区的对象时,可能会出现这种情况。在

相关问题 更多 >