2016-05-25 19 views
26

Django 1.9.6.Overriding AppConfig.ready()

Cercando di cogliere le basi di Django. Vale a dire come funzionano le applicazioni. La documentazione: https://docs.djangoproject.com/en/1.9/ref/applications/#methods

E nel codice della classe AppConfig possiamo leggere:

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

Bene, questo è il mio esempio:

my_app/apps.py

class MyAppConfig(AppConfig): 
    name = 'my_app' 

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

Voglio solo far funzionare il metodo pronto. Cioè, quando Django trova my_app, lascia che esegua il metodo ready.

L'app è registrata in INSTALLED_APPS.

Eseguo "python manage.py runserver". E niente è stampato.

Se inserisco un breakpoint nel metodo ready, il debugger non si ferma qui.

Potete aiutarmi: qual è il mio errore nel capire qui. Grazie in anticipo.

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

e ho creato una vista

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') 
] 

Beh, la vista sta lavorando. Ciò significa che l'applicazione è registrata.

+0

Si prega di mostrare il codice dalle impostazioni in cui si registra l'app in 'INSTALLED_APPS'. –

+0

Per favore, vedi il post modificato. – Michael

risposta

47

È necessario eseguire una delle due cose. O esplicitamente dire quale AppConfig si desidera in INSTALLED_APPS:

INSTALLED_APPS = [ 
    'my_app.apps.MyAppConfig' 
] 

Oppure, definire un default_app_config nel __init__.py della vostra applicazione:

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

(e lasciare INSTALLED_APPS così com'è).

Attualmente Django non riesce a trovare alcun AppConfig per l'app e presume solo che non ce ne sia uno. Quindi le tue visualizzazioni, ecc. Funzioneranno, ma il metodo ready() non verrà mai chiamato.

Ecco lo relevant section of the documentation.