🌱 Django project setup

Wed 1 Jun, 2022




mkdir ~/path/to/project/root

cd ~/path/to/project/root

python3 -m venv ve

source ve/bin/activate

pip install django

pip install psycopg2

django-admin startproject <projectname> .

mkdir apps logs media static templates settings

touch settings/development.py && touch settings/production.py

mv <projectname>/settings.py settings/core.py

echo "from .core import *" >> settings/development.py

echo "from .core import *" >> settings/production.py

vim manage.py

edit:

os.environ.setdefault('DJANGO_SETTINGS_MODULE','<projectname>.settings')

to:

os.environ.setdefault('DJANGO_SETTINGS_MODULE','settings.development')

:wq

 

Setup a secrets file on local system and then:

vim settings/core.py

insert:

import os
from pathlib import Path
from configparser import RawConfigParser

config = RawConfigParser()
config.read('/etc/secrets/<projectname>/settings.ini')

BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = config.get('SECRETS','SECRET_KEY')

In TEMPLATES =[]:

'DIRS': [os.path.join(BASE_DIR,'templates')],

In DATABASES = {}:

DATABASES ={
    'default': {
        'ENGINE':      config.get('DATABASE','ENGINE'),
        'NAME':        config.get('DATABASE','NAME'),
        'USER':        config.get('DATABASE','USER'),
        'PASSWORD':    config.get('DATABASE','PASSWORD'),
        'HOST':        config.get('DATABASE','HOST'),
        'PORT':        config.get('DATABASE','PORT'),
    }
}

:wq

 

vim settings/development.py

insert:

DEBUG = True

ALLOWED_HOSTS = []

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static/')
]

 

vim settings/production.py

insert:

DEBUG = False
SITE_ID = 1
SECURE_HSTS_SECONDS = 1
SECURE_SSL_REDIRECT = True
CSRF_COOKIE_SECURE = True
SESSION_COOKIE_SECURE = True
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_REFERRER_POLICY= "origin"

ALLOWED_HOSTS = ['<example.jcaston.uk>']

STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

 

Also, set up a db environment that is as similar as you can make it to whatever your production environment will be.

In commandline:

$ sudo su postgres
$ psql
$ CREATE DATABASE <name_of_db>;
$ CREATE USER <name_of_db_user> WITH PASSWORD 'p455w0rd';
$ ALTER USER <name_of_db_user> WITH SUPERUSER;
$ GRANT ALL PRIVILEGES ON DATABASE <name_of_db> TO <name_of_db_user>;
$ exit
$ exit

Add these credentials to your

/etc/secrets/<projectname>/settings.ini

 

Don't forget to edit:

~/path/tp/project/root/<projectname>/wsgi.py

from:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<projectname>.settings')

to:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.production')

 

And prepare a directory in:

~/path/to/project/root/apps

with a directory named the same as your app, ready for:

(ve) python manage.py startapp <app_name> apps/<directory>

And edit:

~/path/to/project/root/apps/<app_name>/apps.py

from:

name = '<app_name>'

to:

name = 'apps.<app_name>'

 

And now you're ready to actually do something.

blog.jcaston.uk // 2025