AppConfig.ready () überschreiben

74

Der Versuch, die Grundlagen von Django zu verstehen. Nämlich wie Anwendungen funktionieren. Die Dokumente: https://docs.djangoproject.com/de/stable/ref/applications/#methods

Und im Code der Klasse AppConfig können wir lesen:

def ready(self):
    """
    Override this method in subclasses to run code when Django starts.
    """

Nun, das ist mein Beispiel:

my_app / apps.py

class MyAppConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        print('My app')

Ich möchte nur die fertige Methode zum Laufen bringen. Das heißt, wenn Django my_app findet, lassen Sie es die ready-Methode ausführen.

Die App ist in INSTALLED_APPS registriert.

Ich führe 'python manage.py runserver' aus. Und nichts wird gedruckt.

Wenn ich einen Haltepunkt in die Ready-Methode setze, stoppt der Debugger dort nicht.

Könnten Sie mir helfen: Was ist mein Fehler beim Verständnis hier. Danke im Voraus.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'my_app',
]

Und ich habe eine Ansicht erstellt

my_app / views.py

def index(request):
    print('Print index')

urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', my_app_views.index, name='home')
]

Nun, die Aussicht funktioniert. Dies bedeutet, dass die Anwendung registriert ist.

Michael
quelle
Bitte zeigen Sie den Code aus den Einstellungen, in denen Sie die App registrieren INSTALLED_APPS.
Kevin Christopher Henry
Bitte beachten Sie den bearbeiteten Beitrag.
Michael
@ Michael funktioniert es für dich? Weil ich versuche, dasselbe zu tun und akzeptierte Antworten verwende und es nicht funktioniert
KyluAce

Antworten:

142

Sie müssen eines von zwei Dingen tun. Sagen AppConfigSie entweder explizit, was Sie wollen INSTALLED_APPS:

INSTALLED_APPS = [
    'my_app.apps.MyAppConfig'
]

Oder definieren Sie ein default_app_configin __init__.pyIhrer App:

# my_app/__init__.py
default_app_config = 'my_app.apps.MyAppConfig'

(und so lassen INSTALLED_APPSwie es ist).

Da es derzeit so ist, kann Django keine AppConfigfür die App finden und geht einfach davon aus, dass es keine gibt. Ihre Ansichten usw. werden also funktionieren, aber die ready()Methode wird niemals aufgerufen.

Hier ist der relevante Abschnitt der Dokumentation .

Solarissmoke
quelle
Wenn ich versuche, die Zeile hinzuzufügen my_app/__init__.py, wird die ready()Funktion nicht aufgerufen . Es funktioniert gut mit der INSTALLED_APPSRoute. Irgendeine Idee, warum das nicht heißen würde?
Wasserschlange
5
Es gibt mir django.core.exceptions.AppRegistryNotReady: Apps sind noch nicht geladen. Fehler
Parikshit Chalke
Beachten Sie, dass Sie --noreloadbeim Ausführen des Servers param hinzufügen müssen, um die Methode call ready () zweimal zu überspringen.
Dphans
1
@ParikshitChalke Ich hatte das gleiche Problem. Dies wird durch zirkuläre Importe verursacht. Verschieben Sie einfach alles, was Sie importieren, innerhalb ready()und nicht außerhalb, und es wird funktionieren.
Lapin