We aim to make consistent use of our project structure for all Django products, as far as possible. Modifications are made on a project-by-project basis, however we try to keep the core Django structure the same.
An example project structure, highlighting the more important files and folders is shown below:
blog/ - application folder for a standalone blog
page/ - application folder for common web pages
core/ - application folder for the core site
utils/ - folder to store utilities and helpers for custom applications
common.py - base site settings
dev.py - additional development site settings
prod.py - additional production site settings
urls.py - site url patterns
media/ - application media folder
nginx/ - nginx configuration for deployment
static/ - application static content
dev.env - environment variables for development
docker-compose.dev.yml - docker-compose for development
docker-compose.prod.ssl.yml - docker-compose for production (with ssl)
docker-compose.prod.yml - docker-compose for production
Dockerfile - docker configuration for development
Dockerfile.prod - docker configuration for production
manage.py - Django cli caller
prod.env - environment variables for production
README.md - readme file for product
requirements.txt - requirements for development and production
Here, we are leveraging Docker and docker-compose in order to build and run the application. Each docker configuration has an associated compose .yml file (e.g. docker-compose.dev.yml), a docker configuration file (e.g. Dockerfile), and it will make use of our requirements file to know which packages and versions to use as part of the build (requirements.txt) as well as an appropriate environment variable file for that environment (e.g. dev.env).
It is also worth noting that the environment variable file used by Docker will specify which Django settings configuration to use. For example, config.setting.dev is used for development, while config.settings.prod is used for production. However, both configurations leverage common.py as a base.
We also have separate folders for our application media versus static content. We typically serve static content via Django, but many of our products include environment variable options to allow use of an external S3 store to serve media files.
In the apps folder, we tend to include three base apps for all products. These include 'core', which is an app including all models and views associated with site configuration settings and global options, 'page', which is an app covering common and more static nature web pages (e.g. landing page, about us, contact us etc.), and finally, 'utils', which is not an application, but rather a collection of mixins which we have put together for users of our products to make use of.
Finally, we include a README.md file for all of our products. That file includes instructions on how to build the application via docker-compose as well as a list of helpful commands.