88 votes

Surcharge de AppConfig.ready()

J'essaie de comprendre les bases de Django. A savoir comment fonctionnent les applications. La documentation : https://docs.djangoproject.com/en/stable/ref/applications/#methods

Et dans le code de la classe AppConfig on peut lire :

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

Eh bien, c'est mon exemple :

mon_app/apps.py

class MyAppConfig(AppConfig):
    name = 'my_app'

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

Je veux juste faire fonctionner la méthode prête. C'est-à-dire que lorsque Django trouve mon_app, il doit exécuter la méthode ready.

L'application est enregistrée dans INSTALLED_APPS.

J'exécute 'python manage.py runserver'. Et rien n'est imprimé.

Si je place un point d'arrêt dans la méthode ready, le débogueur ne s'arrête pas là.

Pourriez-vous m'aider : quelle est mon erreur de compréhension ici ? Je vous remercie d'avance.

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

Et j'ai créé une vue

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

Eh bien, la vue fonctionne. Cela signifie que l'application est enregistrée.

0 votes

Veuillez montrer le code des paramètres dans lesquels vous enregistrez l'application. INSTALLED_APPS .

0 votes

S'il vous plaît, voyez le message édité.

0 votes

@Michael, est-ce que ça marche pour vous ? Parce que j'essaie de faire la même chose et j'utilise la réponse acceptée et cela ne fonctionne pas.

169voto

solarissmoke Points 14380

Vous devez faire l'une des deux choses suivantes. Soit dire explicitement quel AppConfig vous voulez dans INSTALLED_APPS :

INSTALLED_APPS = [
    'my_app.apps.MyAppConfig'
]

Ou bien, définissez un default_app_config dans le __init__.py de votre application :

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

(et laisser INSTALLED_APPS en l'état).

En l'état actuel des choses, Django ne peut trouver aucune AppConfig pour l'application et suppose juste qu'il n'y en a pas. Ainsi, vos vues, etc. fonctionneront, mais l'application ready() ne sera jamais appelée.

Voici le section pertinente de la documentation .

Editar à partir de Django 3.2, la spécification d'un default_app_config n'est plus nécessaire, et est en fait déprécié - Cette réponse est donc redondante pour quiconque utilise Django 3.2 ou une version ultérieure.

0 votes

Lorsque j'essaie d'ajouter la ligne à my_app/__init__.py il ne finit pas par appeler ready() fonction. Cela fonctionne très bien en utilisant la fonction INSTALLED_APPS route. Une idée de pourquoi ça ne serait pas appelé ?

5 votes

Cela me donne l'erreur django.core.exceptions.AppRegistryNotReady : Apps aren't loaded yet. error

0 votes

Notez que vous devez ajouter --noreload paramètre lors de l'exécution du serveur pour éviter d'appeler deux fois la méthode ready().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X