heroku 应用程序中新对象的时间戳设置为 heroku 的服务器启动时间,而不是实际的 utcnow 时间
Posted
技术标签:
【中文标题】heroku 应用程序中新对象的时间戳设置为 heroku 的服务器启动时间,而不是实际的 utcnow 时间【英文标题】:Timestamp on new object in heroku app is set to heroku's server start time, not actual utcnow time 【发布时间】:2012-12-17 07:17:07 【问题描述】:我在 heroku 上有一个应用程序,它为新对象设置了错误的时间戳。我一生都想不通为什么。
发生了什么:
我正在 heroku-run 网站上提交表单。
Django 视图创建新对象并保存
models.py 有“ts = models.DateTimeField(default = datetime.now(utc))”所以它应该在提交时保存 utc 时间戳(它在本地执行) ,但在 heroku 上,它会保存服务器启动时间的时间戳。
模型.py:
class NewsArticle(models.Model):
link = models.URLField(max_length = 2000)
title = models.CharField(max_length = 300)
img_path = models.CharField(null = True, max_length = 300)
ts = models.DateTimeField(default = datetime.now(utc))
user = models.ForeignKey(User)
hostname = models.CharField(max_length = 300)
deleted = models.BooleanField(default = False)
Views.py:
news_article = NewsArticle(...)
news_article.save()
print news_article.ts
print datetime.now(utc)
import sys
sys.stdout.flush()
heroku 日志中的相应输出(我在 UTC 22:00:34 重新启动了 Heroku 服务器):
2013-01-02T22:01:56+00:00 app[web.1]: 2013-01-02 22:00:34.746547+00:00
2013-01-02T22:01:56+00:00 app[web.1]: 2013-01-02 22:01:56.919520+00:00
然后在 15 分钟后再次:
2013-01-02T22:15:46+00:00 app[web.1]: 2013-01-02 22:00:34.746547+00:00
2013-01-02T22:15:46+00:00 app[web.1]: 2013-01-02 22:15:46.489815+00:00
很明显,models.py 中发生的 datetime.now(utc) 调用有问题,但我不知道为什么。有人有想法吗?
【问题讨论】:
我的猜测是它与此有关:***.com/questions/2771676/… - 这样每个实例的启动都不会闲逛,你必须明确地让它得到时间...... 【参考方案1】:您的问题可能在于您如何设置默认值。以下两组代码完全相同:
now_at_import = datetime.now(utc)
MyModel
...
ts = models.DateTimeField(default = now_at_import)
#is exactly the same as
MyModel
...
ts = models.DateTimeField(default = datetime.now(utc))
你想要的是:
def get_utc_now():
return datetime.now(utc)
MyModel
...
ts = models.DateTimeField(default = get_utc_now)
【讨论】:
啊,你是对的。那解决了它。非常感谢。不能说我会很快得到那个。以上是关于heroku 应用程序中新对象的时间戳设置为 heroku 的服务器启动时间,而不是实际的 utcnow 时间的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法为 Heroku Toolbelt 设置默认应用程序?