代码之家  ›  专栏  ›  技术社区  ›  Nixarn

django应用程序中的datetime.now()出错

  •  6
  • Nixarn  · 技术社区  · 17 年前

    部署完Django应用程序后,它出现了一些问题。我在Ubuntu服务器上使用apache+mod wsgi。在我重新启动服务器后一段时间,时间到了foobar,大约-10小时是错误的。我做了一个Django视图,看起来像:

    def servertime():
      return HttpResponse( datetime.now() )
    

    在我重新启动服务器并检查显示该视图的URL之后,它看起来还不错。然后在某一点上,它有时给出正确的时间,有时没有,后来它总是给出错误的时间。不过,服务器时间是核心的。

    有什么线索吗?我没有运气就在谷歌上搜索了它。

    7 回复  |  直到 13 年前
        1
  •  6
  •   phillc    17 年前

    我也能看到你的urls.py吗?

    类似的行为曾经让我感到困惑…

    结果是我的urls.py调用视图的方式。python运行了一次datetime.now(),并将其存储起来以备将来调用,而不再真正调用它。这就是为什么django-devs必须实现将函数(而不是函数调用)传递给模型的默认值的能力,因为它将接受函数的第一个调用,并使用该调用直到python重新启动。

    您的行为听起来第一次是正确的,因为它是第一次调用视图。有时是不正确的,因为它又有了同样的日期。然后它又是随机正确的,因为您的Apache可能为它启动了另一个工作进程,当您在处理请求的进程之间跳转时,这种疯狂可能会发生。

        2
  •  5
  •   Nixarn    17 年前

    我发现让wsgi进入守护进程模式是可行的。不知道为什么,但确实如此。似乎一些新创建的流程会把时间搞砸。

        3
  •  2
  •   David    14 年前

    当类被实例化时,可能会对datetime.now()进行一次计算。尝试移除括号,以便返回函数datetime.now,然后对其进行计算。我在为datetimefields设置默认值和编写解决方案时遇到了类似的问题。 here .

        4
  •  1
  •   Xbito    17 年前

    可能服务器在服务器启动时正在评估datetime.now(),请尝试通过模板使其变懒,或者使用视图中的变量。

    看看这个 blog post .

        5
  •  1
  •   Klaas van Schelven    16 年前

    Django根据您的设置变量时区设置系统时区。当运行具有不同时区设置的多个Django实例时,这可能会导致各种混乱。

    这就是Django所做的:

    os.environ['TZ'] = self.TIME_ZONE
    

    以上答案:

    “我发现将wsgi置于守护进程模式是有效的”

    不适合我…

    我想我不会再使用姜戈的内置时区了。

        6
  •  0
  •   Jiaaro    17 年前

    您可能需要这样指定内容类型

    def servertime():
      return HttpResponse( datetime.now(), content_type="text/plain" )
    

    另一个想法:

    它可能不工作,因为datetime.now()返回一个datetime对象。试试这个:

    def servertime():
      return HttpResponse( str(datetime.now()), content_type="text/plain" )
    
        7
  •  0
  •   Blas    13 年前

    尝试在settings.py中设置时区(时区变量)。

    这对我很有用。