When to create a new app (with startapp) in Django?
Asked Answered
I

8

145

I've googled around for this, but I still have trouble relating to what Django defines as "apps".

Should I create a new app for each piece of functionality in a site, even though it uses models from the main project?

Do you guys have good rule of thumb of when to split off a new app, and when to keep functionality together with the "main project" or other apps?

Improvisator answered 15/9, 2008 at 16:3 Comment(0)
M
52

James Bennett has a wonderful set of slides on how to organize reusable apps in Django.

Meningitis answered 15/9, 2008 at 16:35 Comment(2)
Does that mean, if I make a child model, it must always be in the same app? Since I can't easily drop it into another project without bringing over two "apps"Draftsman
This is a link to the video for those slides: youtube.com/watch?v=A-S0tqpPga4. And this video is about django codebase with over 500 apps: youtube.com/watch?v=NsHo-kThlqI&t=1168s ... so the answer to when to split a django app is always YES!Shoebill
O
27

I prefer to think of Django applications as reusable modules or components than as "applications".

This helps me encapsulate and decouple certain features from one another, improving re-usability should I decide to share a particular "app" with the community at large, and maintainability.

My general approach is to bucket up specific features or feature sets into "apps" as though I were going to release them publicly. The hard part here is figuring out how big each bucket is.

A good trick I use is to imagine how my apps would be used if they were released publicly. This often encourages me to shrink the buckets and more clearly define its "purpose".

Olivero answered 15/9, 2008 at 16:32 Comment(0)
B
22

Here is the updated presentation on 6 September 2008.

DjangoCon 2008: Reusable Apps @7:53

Slide: Reusable_apps.pdf

Taken from the slide

Should this be its own application?

  • Is it completely unrelated to the app’s focus?
  • Is it orthogonal to whatever else I’m doing?
  • Will I need similar functionality on other sites?

If any of them is "Yes"? Then best to break it into a separate application.

Blazon answered 7/11, 2011 at 9:15 Comment(2)
The slide I saw does not contain the first question about "app's focus."Threat
@Threat It's there at slide 31 of 99.Blazon
M
16

I tend to create new applications for each logically separate set of models. e.g.:

  • User Profiles
  • Forum Posts
  • Blog posts
Mayhap answered 15/9, 2008 at 16:12 Comment(0)
A
11

The two best answers to this question I've found around the web are:

  1. The Reusable Apps Talk (slides)(video) also mentioned in other answers. Bennett, the author and Django contributor, regularly publishes apps for others to use and has a strong viewpoint towards many small apps.
  2. Doordash's Tips for Django at Scale which gives the opposite advice and says in their case they migrated to one single app after starting with many separate apps. They ran into problems with the migration dependency graph between apps.

Both sources agree that you should create a separate app in the following situations:

  • If you plan to reuse your app in another Django project (especially if you plan to publish it for others to reuse).
  • If the app has few or no dependencies between it and another app. Here you might be able to imagine an app running as its own microservice in the future.
Askance answered 12/12, 2018 at 2:16 Comment(1)
I can back this - having everything in a single app_core or similar means that your migration deps are linear and just so much more straightforward to understand. It also means you can split into /models, /views and other directories and create something much easier to reason with at a glance, and lessen the actual surface area of the directory tree which can make the the application feel more compact, even if technically isn't. So it's been a good pattern for me.Snakebite
P
8

The rule I follow is it should be a new app if I want to reuse the functionality in a different project.

If it needs deep understanding of the models in your project, it's probably more cohesive to stick it with the models.

Prophesy answered 16/9, 2008 at 0:1 Comment(0)
U
6

The best answer to this question is given by Andrew Godwin (Django core developer):

The main purpose of apps is, in my eyes, to provide logical separation of reusable components - specifically, a first-class namespace for models/admin/etc. - and to provide an easy way to turn things “on” or “off”.

In some ways, it’s a relic of the time when Django was created - when Python packaging and modules were much less developed and you basically had to have your own solution to the problem. That said, it’s still a core part of Django’s mental model, and I think INSTALLED_APPS is still a cleaner, easier solution than Python’s replacement offering of entrypoints (which makes it quite hard to disable a package that is installed in an environment but which you don’t want to use).

Is there anything specifically you think could be decoupled from the app concept today? Models and admin need it for autodiscovery and a unique namespace prefix, so that’s hard to undo, and I’m struggling to think of other features you need it for (in fact, if all you want is just a library, you can make it a normal Python one - no need for the app wrapping unless you’re shipping models, templates or admin code IIRC)

Udella answered 21/10, 2020 at 12:33 Comment(2)
Can you add the reference from which you got this quote from Godwin?Favored
@Favored forum.djangoproject.com/t/why-do-we-need-apps/827Udella
H
2

An 'app' could be many different things, it all really comes down to taste. For example, let's say you are building a blog. Your app could be the entire blog, or you could have an 'admin' app, a 'site' app for all of the public views, an 'rss' app, a 'services' app so developers can interface with the blog in their own ways, etc.

I personally would make the blog itself the app, and break out the functionality within it. The blog could then be reused rather easily in other websites.

The nice thing about Django is that it will recognize any models.py file within any level of your directory tree as a file containing Django models. So breaking your functionality out into smaller 'sub apps' within an 'app' itself won't make anything more difficult.

Hypnogenesis answered 15/9, 2008 at 22:56 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.