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.
INSTALLED_APPS
.Antworten:
Sie müssen eines von zwei Dingen tun. Sagen
AppConfig
Sie entweder explizit, was Sie wollenINSTALLED_APPS
:INSTALLED_APPS = [ 'my_app.apps.MyAppConfig' ]
Oder definieren Sie ein
default_app_config
in__init__.py
Ihrer App:# my_app/__init__.py default_app_config = 'my_app.apps.MyAppConfig'
(und so lassen
INSTALLED_APPS
wie es ist).Da es derzeit so ist, kann Django keine
AppConfig
für die App finden und geht einfach davon aus, dass es keine gibt. Ihre Ansichten usw. werden also funktionieren, aber dieready()
Methode wird niemals aufgerufen.Hier ist der relevante Abschnitt der Dokumentation .
quelle
my_app/__init__.py
, wird dieready()
Funktion nicht aufgerufen . Es funktioniert gut mit derINSTALLED_APPS
Route. Irgendeine Idee, warum das nicht heißen würde?--noreload
beim Ausführen des Servers param hinzufügen müssen, um die Methode call ready () zweimal zu überspringen.ready()
und nicht außerhalb, und es wird funktionieren.