Giter VIP home page Giter VIP logo

djangoer's Introduction

djangoer

A production-ready template for Django applications

Introduction

This Django template was created out of a need for consistent structure for projects with a setup that's easy to understand and use with as minimal additional setup as possible.

How to use

Three commands and you're good to go:

  • cp .env.example .env
  • make build
  • make up

A much detailed explanation is in the How to use (fleshed-out) section.

Features

  • Uses standard Django application structure. No folder complexities to be navigated through.
  • Drop-in template, two commands and you have all the features at your fingertips: make build && make up
  • Built-in simple Docker set up that just works!
  • Support for .env files and typed environmental variables using Pydantic. Try running your application without needed environment variables and it crashes immediately, fail-fast without future tears.
  • First class support for Postgres. Just add DATABASE_URL in your .env file.
  • Uses lightning fast Ruff for both formatting and linting. Drop-in replacement for Black and Isort and 10 - 100x faster too!
  • Easy way to run commands using make. Run migrations with make migrate, start application with make up. No need to memorize verses of commands.
  • Included GitHub workflow for running tests
  • Environment based settings file
  • Everything you need to start implementing your first API.

What is hoped to be achieved

  • Simplicity; no need for bloated classes and huge utils that you'll likely never use. Everything here should be very much needed in most projects
  • Low barrier for entry; a template that is easy to start with and does not seem too advanced for beginners to use
  • Production-ready; the above does not remove the important fact that this should be always production-ready without obvious faults
  • Consistency; a smell for codebases is you not having a 'knowing' of where certain code is located. A wanted structure is one that's easy to navigate

What is not hoped to be achieved

  • Utility dump; this template will not be where all sorts of utilities are dumped because, 'why not?'.
  • I'm out of points, sorry. This kind of stuff should be like 3 points or so, but then...

How to use (Fleshed out)

Requirements:

  • Make, Docker and Docker Compose

Running the application with Docker (recommended)

  • Clone the repo
  • cd into the repo
  • Duplicate the file named ".env.example", rename the new copy to ".env".
  • Edit the content of the .env file as you want. At this point you'll also want to edit the environment section of the postgres service in the docker-compose.yml file to reflect your choice of database. Ensure you correlate this change with the content of the .env file.
  • Perform migrations with make migrate
  • Create your superuser account with make createsuperuser. Fill in required details. Note that your password won't display on the screen. Type blindly and trust everything to work.
  • To start the server, run make up
  • You can start making requests by visiting http://127.0.0.1:8000
  • Edit the template as you want for your app

Running the application outside of Docker (not recommended, not even remotely)

  • Create a database with Postgres through the psql command. Can't remember the whole steps and I'm too tired to google it, it's why I said you should use Docker.
  • Duplicate the file named ".env.example", rename the new copy to ".env".
  • Edit the content of the .env file as you want, especially to reflect your choice of database. Ensure you correlate this change with the results of of the first step
  • Perform migrations with python manage.py migrate. You still don't want to use Docker?!
  • To start the server, run gunicorn --bind 0.0.0.0:8000 config.wsgi:application. Lol, I told you to use Docker.
  • You can start making requests by visiting http://127.0.0.1:8000
  • Edit the template as you want for your app (switch to Docker)

Glossary

This section contains a list of commonly needed helps while working on this project.

Majority of the commands you'll need are in the Makefile and can be run as:

make <command>

All needed commands currently in the Makefile

  • up: start up the containers
  • bash: starts a bash shell for the application
  • build: builds the containers only
  • build-up: builds and starts the containers
  • createsuperuser: spawns the Django app to create a superuser
  • down: stops the containers
  • format: runs isort and black on the codebase to make it fine
  • flush-db: empties the database and begins the DB from scratch
  • install: installs all dependencies in a virtual env locally
  • lint: runs ruff to sort import and format the code
  • migrations: creates migrations based on DB schema
  • migrate: runs the created migrations
  • resetdb: resets the database, deletes everything including the database itself
  • run-command: runs a command in the Django app context. For example, make run-command command="python manage.py test"
  • shell: spawns a shell within the Django app context. The same as manage.py shell.
  • test: runs the test suite using pytest
  • testcase: runs a single test case. For example, make testcase testcase="tests/test_models.py::TestUserModel::test_user_can_be_created"
  • up-d: starts up the container without logs

How do I run commands in Docker?

First check the list above if the command you need is there. If it is, you can run it as make <command>. For example, to run tests, I can do: make test. If it isn't, continue reading.

Ideally, you should be using make run-command command="<command>". For example, to run tests, I can do: make run-command command="python manage.py test".

However, if you're not using make, you can run commands in Docker using the syntax: docker compose run <name-of-container-volume> <command>. For example, to run tests, I can do: docker compose run web python manage.py test.

How do I enable auto-imports for libraries on VSCode

  • Outside of docker, run make install
  • Start a virtual environment in the root folder by running pipenv shell
  • On your VSCode, at the bottom right corner, you'll see a Python version, click on it and select the Python interpreter created from your virtual environment. You can continue your work inside docker.

Change Log

31-01-2023

  • Initial release
  • Added support for Postgres
  • Added support for .env files
  • Added support for typed environmental variables using Pydantic
  • Added Docker support

20-02-2023

  • Added Make command for formatting and linting

13-01-2024

  • Added auto removal of containers when running one-off commands

24-01-2024

  • Trim down Dockerfile to reduce needless steps and upgrade python version
  • Added extensions for resetting db
  • Added command to run any command on app shell
  • Replaced test runner with pytest
  • Renamed makemigrations command to migrations
  • Removed black and ruff
  • Upgraded pydantic
  • Replaced linter and formatter with ruff
  • Bumped Python version to 3.12
  • Added environment based settings file
  • Added changelog

Got problems?

Raise an issue.

FAQs

  1. Q: Why do you insist I use Docker?

    A: It is actually easier to use and setup than the alternative. You can also easily switch to the alternative if you want to.

djangoer's People

Contributors

lordsarcastic avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

djangoer's Issues

Change Python version to 3.11

Python 3.12 is still not widely supported by several Django-related packages, especially drf-yasg. The Python version should be bumped down to 3.11. Changes to be made are in:

  • Dockerfile
  • Pipfile
  • CI workflow
  • Pyproject.toml

Dependencies should be resynced to ensure application works.

Add Swagger integration to template

Swagger provides a ready-made documentation out of the box for DRF APIs. Using the drf-yasg package, this can be achieved.

Documentation should be placed on the root page /.

This issue requires #7 to be completed.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.