Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Overriding AppConfig.ready()

Tags:

django

Trying to catch the basics of Django. Namely how Applications work. The docs: https://docs.djangoproject.com/en/stable/ref/applications/#methods

And in the code of the class AppConfig we can read:

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

Well, this is my example:

my_app/apps.py

class MyAppConfig(AppConfig):     name = 'my_app'      def ready(self):         print('My app') 

I just want to make the ready method work. That is, when Django finds my_app, let it run the ready method.

The app is registered in INSTALLED_APPS.

I execute 'python manage.py runserver'. And nothing is printed.

If I place a breakpoint inside the ready method, the debugger don't stop there.

Could you help me: what is my mistake in understanding here. Thank you in advance.

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

And I created a view

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

Well, the view is working. This means that the application is registered.

like image 709
Michael Avatar asked May 25 '16 06:05

Michael


People also ask

What is AppConfig Django?

The AppConfig class used to configure the application has a path class attribute, which is the absolute directory path Django will use as the single base path for the application.

What is project and app in Django?

A project refers to the entire application and all its parts. An app refers to a submodule of the project. It's self-sufficient and not intertwined with the other apps in the project such that, in theory, you could pick it up and plop it down into another project without any modification.


1 Answers

You need to do one of two things. Either explicitly say which AppConfig you want in INSTALLED_APPS:

INSTALLED_APPS = [     'my_app.apps.MyAppConfig' ] 

Or, define a default_app_config in the __init__.py of your app:

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

(and leave INSTALLED_APPS as-is).

As it is currently Django can't find any AppConfig for the app and just assumes there isn't one. So your views etc. will work, but the ready() method will never get called.

Here's the relevant section of the documentation.

Edit: as of Django 3.2, specifying a default_app_config is no longer necessary, and is in fact deprecated - so this answer is redundant for anyone using Django 3.2 or later.

like image 115
solarissmoke Avatar answered Sep 22 '22 03:09

solarissmoke