2014-02-23 12 views
6

Also habe ich mich schon viel umgesehen, konnte aber keine gute Antwort finden. Ich benutze Sellery 3.1.7 und Django 1.5.1., Ohne Django-Sellerie-Paket, da neuere Versionen von Sellerie es nicht mehr benötigen. Ich habe es geschafft, Aufgaben zu erstellen und sie mit RabbitMQ auszuführen. Alles funktioniert so wie es sollte. Allerdings integriere ich dies in ein bestehendes, recht großes Django-Projekt. Dort haben wir einige Django-Einstellungsdateien angegeben, nicht nur eine. Je nach Umgebung führen wir unterschiedliche aus, zum Beispiel einen für lokale Maschinen und einen für Server. Mein Problem ist, dass ich nicht in der Lage bin herauszufinden, welche Einstellungsdatei "aktiv" ist von dem Sellerie-Arbeiter, der die sellery.py-Datei in meinem Projektstamm ausführt (wie in der Dokumentation angegeben). Es erfordert die Dokumentation Django-Einstellungen wie diese Datei angeben:Aktive Django-Einstellungsdatei von Sellerie-Arbeiter

os.environ.setdefault('DJANGO_SETTINGS_MODULE', "project.settings.server") 

nun das funktioniert, aber wenn ich die Sachen vor Ort bewegen muß ich es settings.local ändern, damit es funktioniert, und dass jedes Mal. Das Lesen von Einstellungsobjekten in Runtime, wie ich es in Standard-Django-Dateien mache, funktionierte nicht, da Sellerie-Worker in einem anderen Prozess ausgeführt wird. Hat also jemand aus dieser Situation eine Idee, wie man aktive Django-Einstellungsdateien dynamisch von Selleriearbeitern holt? Oder vielleicht als Variable beim Start von Sellerie Arbeiter übergeben? (wie für Django, etc --settings = project.settings.local) Danke!

Antwort

3

Eine Idee könnte sein, dass Django jedes Mal die richtige Einstellungsdatei lädt und Sellerie das verwendet, was Django benutzt. So mache ich es.

Sagen Sie bitte die Projektstruktur haben:

project/ 
    proj/ 
     settings.py 
     urls.py 
     ... 

Ersetzen mit

project/ 
    proj/ 
     settings/ 
      __init__.py 
      local.py 
      production.py 
      common_settings.py 
      ... 
     urls.py 
     ... 

Let common_settings.py alle Einstellungen zwischen allen Umgebungen gemeinsam genutzt werden und Ihre init Py Last was Config lassen sollte verwendet werden.

Jetzt können Sie sich immer darauf verlassen, dass project.proj.settings die richtige Einstellungsdatei für Ihre Umgebung ist.

+0

Warum der Downvote? Es löst das Problem. – olofom

+0

Ich mag diesen Ansatz eigentlich, sieht nach einem guten Start aus! Danke vielmals! – MaRiNkO

+0

Funktioniert nicht für mich – Nirri

2

setdefault() gibt den Wert der Variablen in der Systemumgebung zurück. Es wird "project.settings.server" nur zurückgegeben, wenn DJANGO_SETTINGS_MODULE nicht definiert ist.

So würde ich die am häufigsten verwendeten Einstellungen Modul dort verlassen und es ändern, wenn durch die explizite Deklaration der Umgebungsvariablen benötigt:

dh für die lokale Entwicklung, in Ihrem virtualenv Haken, in Ihrem .bashrc, manuell usw. :

export DJANGO_SETTINGS_MODULE=project.settings.local.

+0

Ein guter Tipp, aber ich habe mehrere Server-Einstellungen für mehrere Server-Umgebungen, so dass würde die Einrichtung von Haken auf jedem von ihnen, was meine Idee von "out of the box" bricht. Ansonsten ein guter Ansatz, könnte es für etwas anderes verwenden, danke! – MaRiNkO

20

Wenn Sie den Sellerie-Worker in der Befehlszeile initialisieren, legen Sie einfach die Umgebungsvariable vor dem Sellerie-Befehl fest.

DJANGO_SETTINGS_MODULE='proj.settings' celery -A proj worker -l info

+1

Ich kenne seinen zu alten Thread. Aber ich bin darüber gestolpert, weil ich dasselbe gebraucht habe. Ich habe 'DJANGO_SETTINGS_MODULE = 'proj.settings' Sellerie-A proj-worker -l info' exportiert –