2009-05-19 1 views
6

Ich hatte einige Probleme mit einer Django-Anwendung, nachdem ich es bereitgestellt habe. Ich benutze einen Apache + mod-wsgi auf einem Ubuntu-Server. Eine Weile, nachdem ich den Server neu gestartet habe, geht die Zeit nach unten, es ist ungefähr um -10 Stunden falsch. Ich habe eine Django-Ansicht, die wie folgt aussieht:datetime.now() in Django Anwendung geht schlecht

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

und nachdem ich den Server und überprüfen Sie die URL neu zu starten, die diese Ansicht zeigt es zuerst in Ordnung aussieht. Dann gibt es manchmal die richtige Zeit und manchmal nicht und später gibt es immer die falsche Zeit. Die Serverzeit ist jedoch korrekt.

Irgendwelche Hinweise? Ich habe es ohne Glück gegoogelt.

+0

Ist es genau 10 Stunden? Könnte ein Zeitzonenproblem sein. –

+0

Ich experimentierte auch den gleichen Fehler. Es sieht so aus, als ob die 'datetime.now()' Methode beim Serverstart einmal für alle berechnet wird und danach (für das Datum und nicht für die Stunden) konstant ist. Sehr seltsames und unerwartetes Verhalten. Ich werde versuchen, den wsgi_mod im Daemon-Modus einzurichten, wie es in der markierten Antwort vorgeschlagen wird. Und in der Tat, ich habe auch eine PHP-App in der gleichen Zeit ausgeführt ... – perror

+0

Das war mit Django 1.1, also wahrscheinlich kein Problem mehr mit Djangos neuer Zeitzonenunterstützung. – Nixarn

Antwort

5

Ich fand, dass das Setzen von wsgi im Daemon-Modus funktioniert. Nicht sicher, warum, aber es tat. Scheint so, als ob einige der neu erstellten Prozesse die Zeit vermasseln.

+6

Höchstwahrscheinlich, weil Sie in Apache eine andere Webanwendung zur gleichen Zeit wie PHP ausgeführt haben, und diese Anwendung die Zeitzone geändert hat, um ein anderer Wert zu sein und mit der Django-Anwendung zu verschrauben. Dieses Problem ist in der Dokumentation zu mod_wsgi unter http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Timezone_and_Locale_Settings dokumentiert. –

6

Kann ich Ihre urls.py auch sehen?

ähnliche Verhaltensweisen stapften mich einmal vor ...

Was es der Weg entpuppte war, dass mein urls.py die Ansicht genannt. Python hat die Datetime.now() einmal ausgeführt und diese für zukünftige Aufrufe gespeichert, nie wirklich wieder aufgerufen. Aus diesem Grund musste django devs die Fähigkeit implementieren, eine Funktion, nicht einen Funktionsaufruf, an den Standardwert eines Modells zu übergeben, da dies den ersten Aufruf der Funktion erfordern würde und diesen verwenden würde, bis Python neu gestartet wird.

Ihr Verhalten klingt wie das erste Mal korrekt ist, weil es das erste Mal die Ansicht aufgerufen wurde. Es war manchmal falsch, weil es wieder dasselbe Datum bekommen hat. Dann war es zufällig wieder korrekt, weil Ihr Apache wahrscheinlich einen anderen Worker-Prozess dafür gestartet hat, und die Verrücktheit passiert wahrscheinlich, wenn Sie dazwischen kommen, welcher Prozess die Anfrage bearbeitet hat.

0

Sie brauchen, um den Inhaltstyp wie so

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

eine andere Idee geben kann:

es nicht funktioniert werden, da datetime.now() ein Datetime-Objekt zurückgibt. Versuchen Sie folgendes:

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

Vielleicht der Server die datetime.now auswertet() beim Start des Servers, versuchen Sie es faul durch eine Schablone zu machen oder eine Variable in Ihrer Ansicht verwenden.

Werfen Sie einen Blick auf diese blog post.

1

Django legt die Systemzeitzone basierend auf Ihrer Einstellungsvariablen TIME_ZONE fest. Dies kann bei der Ausführung mehrerer Django-Instanzen mit unterschiedlichen TIME_ZONE-Einstellungen zu Verwirrung führen.

Dies ist, was Django tut:

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

Die obige Antwort:

"Ich fand, dass wsgi im Daemon-Modus setzen arbeitet"

nicht für mich arbeiten. ..

Ich denke, ich werde nicht mehr mit Django eingebauten TIME_ZONE verwenden.

2

datetime.now() wird wahrscheinlich einmal ausgewertet, wenn Ihre Klasse instanziiert wird. Versuchen Sie, die Klammern zu entfernen, sodass die Funktion datetime.now zurückgegeben und THEN ausgewertet wird. Ich hatte ein ähnliches Problem mit dem Festlegen von Standardwerten für meine DateTimeFields und schrieb meine Lösung here.

0

Versuchen Sie, Ihre Zeitzone (TIME_ZONE Variable) in settings.py

zu setzen, die für mich gearbeitet.