heroku应用程序中新对象的时间戳设置为heroku的服务器启动时间,而不是实际的utcnow时间

时间:2013-01-02 22:26:49

标签: python django postgresql heroku

我在heroku上有一个应用程序,它为新对象设置了不正确的时间戳。我无法弄清楚为什么要为我的生活。

发生了什么:

  1. 我正在heroku运行的网站上提交表格。

  2. Django视图创建新对象并保存

  3. models.py有“ ts = models.DateTimeField(default = datetime.now(utc))”所以它应该在提交时保存utc时间戳(它在本地执行) ,但在heroku上,它会保存服务器启动时的时间戳。

  4. Models.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日志中的相应输出(我在22:00:34 UTC重新启动了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)调用有些不对,但我不确定原因。有没有人有想法?

1 个答案:

答案 0 :(得分:2)

您的问题可能出在默认设置方面。以下两组代码完全相同:

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)