Come iniziare un nuovo progetto Django

Gianluigi Tiesi

COME INIZIARE UN NUOVO PROGETTO DJANGO

Questo post è una nostra linea guida che usiamo internamente su come configurare un nuovo progetto Django su Debian Buster.

Layout repositories

La struttura delle directory sarà così organizzata:

  • la root del progetto: Cliente/Progetto
  • contenuto:
    • Django Progetto (slug: django_progetto)
    • Angular Progetto (slug: angular_progetto)

Installazione pacchetti partendo da container pulito

Alcuni non sono direttamente legati a django

Creazione utente (solo server)

Create l'utente progetto nel sistema e assegnategli l'ownership della cartella /opt, nella quale verrà fatto il deploy utilizzando da root i seguenti comandi:

  • useradd -m progetto -s /bin/bash
  • chown progetto:progetto /opt

Per lo sviluppo locale utilizzate invece il vostro utente.

Layout progetto

Ogni file di testo/codice del progetto dovrà avere gli EOL Unix e codifica UTF-8 senza BOM. Inoltre dovranno avere un EOL alla fine. Evitate anche i traling whitespaces (su vscode c'è un plugin).

.gitignore consigliato:

Database (PostgreSQL)

Il database e l'utente dovranno essere creati utilizzando l'utente postgres con i seguenti comandi, chiamiamo l'utente come quello creato nel sistema e il db allo stesso modo:

  • createuser progetto
  • createdb -O progetto progetto

Nel caso utilizziate il vostro utente invece: createdb -O vostroutente progetto

Eventuali estensioni postgres vanno create utilizzando l'utente postgres, es.

  • psql progetto
  • CREATE EXTENSION postgis;

Per il database dell'istanza devel aggiungere _devel al nome del database, es. progetto_devel:

createdb -O progetto progetto_devel

Nel caso utilizziate il vostro utente invece: createdb -O vostroutente progetto_devel

Virtualenv

Per lo sviluppo non occorre creare tutta la struttura server, è possibile creare il virtualenv all'interno della directory del progetto con: virtualenv -p python3 venv

Mi raccomando tenere sempre aggiornato il file requirements.txt, ed utilizzare psycopg2-binary invece di psycopg2.

Se utilizzate Visual Studio Code create il file di configurazione .vscode/settings.json

.vscode/launch.json è meglio non versionarlo

Database (Django)

Modificare la configurazione di Django nel seguente modo:

Non servono altri dati perché l'utente che esegue Django è lo stesso dell'utente di sistema.

Nel caso usaste postgis il valore del parametro ENGINE sarà il seguente:

django.contrib.gis.db.backends.postgis

Gestione ambienti (configurazione)

Create la cartella settings all'interno della cartella progetto (dove risiede il file settings.py), muovere il file settings.py nella cartella settings e rinominarlo base.py.

Entrate nella cartella settings, occorre ora modificare il file base.py la linea:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

in

BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '../..'))

in fondo aggiungere il path per la STATIC_ROOT:

Create il file __init__.py

Create i file prod.py e devel.py con in cima:

Spostate i settaggi dipendenti dall'ambiente dal file base.py ai file prod.py e devel.py, tipicamente:

  • DATABASES
  • DEBUG
  • SECRET_KEY
  • ALLOWED_HOSTS
  • Settaggi relativi a servizi eterni

ATTENZIONE non usare mai ALLOWED_HOSTS = ['*'], per lo sviluppo locale potete usare ALLOWED_HOSTS = [] che abilita invece solo localhost.

Potete generare delle diffirenti SECRET_KEY utilizzando i seguenti comandi dalla shell di Django:

Ora create il file .gitignore:

Aggiungetelo all'indice git (presupponendo siate già nel repository) con il comando git add .gitignore altrimenti potreste ritrovarvi nel repository il successivo link.

Deploy Django (server)

Solitamente il deploy di un'istanza Django con il suo relativo frontend viene fatto su un container lxc che gira su uno dei nostri server.

Seguire le sezioni relative alla creazione dell'utente e del database.

Il layout di deploy sarà il seguente:

Per l'istanza di devel la root diventa /opt/progetto/devel.

Da ora in poi tutte le operazioni dovranno tassativamente essere effettuate dall'utente appena creato (su - progetto).

  • Create la root: mkdir -p /opt/progetto/prod
  • Clonate il repository di Django in django_progetto
  • Create il virtualenv: virtualenv -p python3 venv
  • Attivate il virtualenv . venv/bin/activate
  • Entrate nella cartella django_progetto
  • Installate i requirements pip install -r requirements.txt
  • Entrate nella directory progetto/settings ed effettuate il link a local.py dell'ambiente selezionato (qui prod)
  • Ritornate nella root del progetto Django ed eseguite:
    • ./manage.py migrate per inizializzare il db
    • ./manage.py collectstatic per generare i files statici (dovrebbe dire di averli copiati in /opt/progetto/prod/static)
  • Create il file reload per uwsgi: touch reload

Deploy Angular (server)

Copiate i files in /opt/progetto/prod/dist ed assicuratevi esista il file index.html.

Deploy uwsgi (server)

Create nel vostro repository Django la cartella etc/uwsgi e dentro i file ini con gli ambienti, per esempio etc/uwsgi/progetto-prod.ini:

La penultima riga specifica quali path passare a Django e quali servire staticamente dal frontend, uwsgi sarebbe in grado di capirlo da solo, ma Angular produce di default le SPA (Single Page Application) ed ha bisogno di direzionare su index.html tutte le rotte dal lui gestite.

Se non viene usato frontend a parte (Angular) e Django serve direttamente le pagine, sostituire:

plugins = python3,router_static

con

plugins = python3

e la parte frontend con:

La configurazione di uwsgi potrebbe variare a seconda delle necessità, per l'ambiente devel ad esempio utilizzare socket = :3031.

Occorre linkare la configurazione nella directory di uwsgi (da utente root):

  • cd /etc/uwsgi/apps-available
  • ln -s /opt/progetto/prod/django_progetto/etc/uwsgi/progetto-prod.ini
  • ln -s /opt/progetto/prod/django_progetto/etc/uwsgi/progetto-devel.ini (eventualmente)
  • cd /etc/uwsgi/apps-enabled
  • ln -s ../apps-available/progetto-prod.ini
  • ln -s ../apps-available/progetto-devel.ini (eventualmente)

È quindi possibile ora gestire le istanze tramite uwsgi.

Se ci sono problemi controllare il rispettivo log in /var/log/uwsgi/app/progetto-prod.log

Deploy celery (server)

Creare la cartella /opt/progetto/prod/celery e la configurazione di supervisor in etc/supervisor/progetto-prod-celery.conf:

Al solito occorre linkare la configurazione nella directory di supervisor (da utente root):

  • cd /etc/supervisor/conf.d
  • ln -s /opt/progetto/prod/django_progetto/etc/supervisor/progetto-prod-celery.conf
  • supervisorctl update
  • per gestirlo (da utente root) supervisorctl stop progetto-prod-celery e supervisorctl start progetto-prod-celery

Se ci sono problemi controllare i log in /opt/progetto/prod/celery:

  • worker_stdout.log
  • worker_stderr.log