2009-05-19 5 views
6

Djangoアプリケーションを配備した後、いくつかの問題がありました。私は、ubuntuサーバー上でApache + mod-wsgiを使用しています。サーバを再起動してからしばらくすると、時間が狂ってしまいます。間違っているのは約-10時間です。Djangoアプリケーションのdatetime.now()が悪くなる

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

と私は、サーバーを再起動し、ビューはそれが最初に大丈夫に見えることを示しているURLを確認した後:私は次のようになりますDjangoのビューを作りました。それから、ある時点で時には正確な時間が与えられることもありますが、時にはそれが間違った時間を与えることもあります。サーバーの時間はcorectです。

手がかりはありますか?私は運がなければそれをgoogledしました。

+0

正確に10時間ですか?タイムゾーンの問題である可能性があります。 –

+0

私も同じバグを実験しました。 'datetime.now()'メソッドは、サーバの開始時に一度計算され、それ以降は一定です(日付ではなく時間で)。確かに非常に奇妙で予想外の動作。私はマークされた答えで提案されているように、デーモンモードでwsgi_modを設定しようとします。そして、実際には、私は同時に同じ時間にPHPアプリを実行していました... – perror

+0

これはDjango 1.1との互換性があり、Djangoの新しいタイムゾーンサポートでおそらく問題にはなりません。 – Nixarn

答えて

5

私はデーモンモードでwsgiを入れることが機能することを発見しました。理由は分かりませんが、それはありました。新しく作成されたプロセスのいくつかが時間を奪うように見えます。

+6

PHPのような他のWebアプリケーションを同時にApacheで実行していて、そのアプリケーションがタイムゾーンを別の値に変更してDjangoアプリケーションを使用していた可能性が高いためです。この問題は、http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Timezone_and_Locale_Settingsのmod_wsgiドキュメントに記載されています。 –

6

あなたのurls.pyも表示できますか?

同様の行動は前に一度私を困惑...それがあることが判明何

は私urls.pyは、ビューと呼ばれる方法でした。 Pythonはdatetime.now()を一度実行し、将来の呼び出しのためにそれを保存しました。これは、djangoの開発者が、関数呼び出しではなく関数呼び出しをモデルのデフォルト値に渡す機能を実装しなければならない理由です。関数の最初の呼び出しがPythonが再起動されるまで使用されるからです。

最初のビューが呼び出されたため、初めての動作が正しいと思われます。それは同じ日付をもう一度持っているので、時には間違っていた。それから、あなたのApacheがおそらく別のワーカープロセスを開始した可能性があり、プロセスがリクエストを処理している間にバウンドすると、おそらく狂気が発生する可能性があるため、

0

そう

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

別のアイデアのようにコンテンツタイプを指定する必要があります。datetime.nowは()datetimeオブジェクトを返しますので、それが動作していないかもしれ

。このお試しください:サーバ起動時

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

たぶんサーバがdatetime.nowを評価している()は、テンプレートを通じて、それは怠惰作ってみるか、あなたのビューで変数を使用しています。

このblog postをご覧ください。

1

Djangoは、設定変数TIME_ZONEに基づいてシステムタイムゾーンを設定します。異なるTIME_ZONE設定で複数のDjangoインスタンスを実行すると、混乱が生じることがあります。

これは、Djangoが何をするかです:

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

上記の答え:

を私のために動作しません "私はデーモンモードでWSGIを置くことは働くことことがわかりました"。 ..

私は、もうTIME_ZONEで構築されたdjangoを使用しないと思っています。

2

datetime.now()は、クラスがインスタンス化されるときに1回評価される可能性があります。かっこを削除して、関数datetime.nowが返され、THENが評価されるようにしてください。私はDateTimeFieldsのデフォルト値を設定するのと同様の問題があり、私の解決策hereを書きました。

0

は私のために働いたsettings.py

でのタイムゾーン(TIME_ZONE変数)を設定してください。

関連する問題