Django App Initialisierungscode (wie Verbindung zu Signalen)

8

Ich brauche einen Platz, um einen Initialisierungscode auszuführen, der anwendungsspezifisch ist (wie zum Beispiel die Verbindung zu Signalen). Wenn ich den Code in __init__.py -Modul einer Anwendung einfüge, habe ich einen kreisförmigen Import der Modelle erhalten.

Gibt es eine Möglichkeit, eine Funktion auszulösen, wenn das Framework eingerichtet wird und bevor eine Anfrage ausgeführt wird?

Ich benutze ziemlich alte Version von django 96.6, aber ich bin auch an den Lösungen für die aktuelle Version interessiert.

In Bezug auf die Duplizierung anderer Fragen: Hier unterscheidet sich die Frage von den von S.Lott in Kommentaren vorgeschlagenen Duplikaten:

Kommentare zu aktuellen Lösungen: Ich kann keine URLs verwenden, da die meisten meiner Apps keine URLs enthalten. Sie hören nur Signale und speichern zusätzliche Informationen in der Datenbank.

    
Piotr Czapla 19.01.2010, 16:44
quelle

4 Antworten

5

Es empfiehlt sich, Signale in die models.py Ihrer App zu übernehmen.

Versuchen Sie models.py oder urls.py und teilen Sie uns mit, wenn Sie Glück haben.

    
Ben Edwards 19.01.2010, 16:56
quelle
5

Der beste Ort für sowas ... überall, importieren Sie es einfach in Ihre urls.py-Datei (aus offensichtlichen Gründen werden URLs vor allen Anfragen geladen).

    
Alex Gaynor 19.01.2010 16:58
quelle
2

Wenn Sie keine URLs angeben, müssen Sie sie wirklich in models.py einfügen, das ist genau so.

Nun zu deinen Problemen: Du willst es in einem eigenen Modul definieren, großartig, mach das. Um einen zirkulären Import zu vermeiden, verwenden Sie django.db.models.get_model , um das Modell dynamisch für Sie zurückzugeben. Sie können eine Initialisierungsfunktion für Ihr Signalmodul bereitstellen, um das entsprechende Modell zu importieren und die relevanten Signale zu verbinden. Diese Funktion würde dann am Ende von models.py aufgerufen und nur einmal und nach der Initialisierung Ihres Modells ausgeführt.

Es besteht immer noch die Möglichkeit, dass das nicht funktioniert (wenn die Modelle noch nicht fertig sind, wenn Sie es einrichten), aber versuchen Sie es und lassen Sie es uns wissen.

    
Will Hardy 19.01.2010 18:37
quelle
0

Für mich funktioniert Folgendes:

In init .py:

%Vor%

signals.py importiert von Modellen, aber nicht umgekehrt. signals.py enthält Modulcode, der beim Import sofort ausgeführt wird und somit beim Start des django Servers ausgeführt wird.

    
Risadinha 24.09.2014 16:12
quelle

Tags und Links