Andrew,

Yes, that explains a lot.  I'd recommend including this explanation
in one of the articles of your current series.

BTW, one other thing to keep in mind is that we 1.4 users don't
know what an apps.py file is, so we don't appreciate not having
to create one, since we never did before.

Thanks again!
--Fred
------------------------------------------------------------------------
Fred Stluka -- mailto:f...@bristle.com -- http://bristle.com/~fred/
Bristle Software, Inc -- http://bristle.com -- Glad to be of service!
Open Source: Without walls and fences, we need no Windows or Gates.
------------------------------------------------------------------------
On 10/9/14 10:09 PM, Andrew Pinkham wrote:
Hi Fred,
Thanks again for the positive feedback!

I'm sorry I lost you at the App Registry section. I'm afraid I can't recommend 
an article to help with the topic, either. Given your questions, I can see I 
missed the mark. Let me give it another go (warning: this is neither 
technically reviewed nor copy edited).

Django uses the `INSTALLED_APPS` setting to find all of the apps in a project, 
and to build a list of apps to run and use, called an app registry. The way 
Django builds the app registry has changed radically from Django 1.6 to Django 
1.7.

Django 1.6 (and before, but I admit I don't know how far back) used the 
`AppCache` class to maintain a list of these apps. The system was problematic 
because each `AppCache` instance shared state - any change to one `AppCache` 
object lead to a change in all `AppCache` objects. Because of migrations (and 
the need for historical/frozen models), the `AppCache` had to change in Django 
1.7.

Django 1.7 now provides an `Apps` class to be the app registry. Each instance 
is separate from others, allowing the migration system to build historical apps 
and models. You can fetch the `Apps` object (not class!) for your own project 
with:

     from django.apps import apps as django_apps

Referred to as the master registry (the app registry for your project as it 
runs), `django_apps` is an instance of `Apps`, which contains a list of 
`AppConfig` objects.

Starting in Django 1.7 all apps now have an `AppConfig` object attached to 
them. These are built automatically by Django, meaning many developers will be 
able to get away without ever creating an `/app_name/apps.py` file for their 
projects. The ability to override `AppConfig`, however, is quite useful. It 
allows for the implementation of a `ready()` method (seen in the admin 
`AppConfig` subclass) as well as the ability to explicitly set the app label, 
allowing developers to easily rectify namespace conflicts.

Note that we avoid a namespace error thanks to `as django_apps` with 
`AppConfig`. I recommend you do this even if there is no namespace error.

     from django.apps import apps as django_apps
     from . import apps

To deal with this list of `AppConfig` objects (and the models within), all 
`Apps` instances sport a brand new API. We saw it throughout Part II and Part 
III of the article, using it to help us with data migrations and to build our 
checks.

The only trick with `Apps` is that it must be fully built and configured before 
Django can take certain actions, including loading the custom user model, or 
using parts of the translation system. I touched a little bit on it in Part 
III, but plan to expand on it in Part IV.

The bottom line is that the app registry works mostly in the background by 
building a master registry and performing many of its key functions without 
developers ever knowing (just as many developers never knew about Django 1.6's 
`AppCache`). However, understanding the system even a little allows for the 
developer to better edit migrations and create checks, and I suspect that 
interacting with apps via this API will become commonplace.

Fred: Is the above helpful? Feel free to ask more questions.

On Oct 9, 2014, at 4:53 PM, Fred Stluka <f...@bristle.com> wrote:
Otherwise, can you suggest where I can find an article similar to
yours that gets me from 1.4 to 1.5 and on to 1.6 before I use
yours to get me from 1.6 to 1.7?

No, but I hope the process I lay out in Part IV will help you indirectly.

Andrew


--
You received this message because you are subscribed to the Google Groups "Django 
users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/5437445F.6000500%40bristle.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to