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.
Effettuate un link simbolico da prod.py
o devel.py
a local.py
, es.: ln -s prod.py local.py
.
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 alocal.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
esupervisorctl start progetto-prod-celery
Se ci sono problemi controllare i log in /opt/progetto/prod/celery
:
worker_stdout.log
worker_stderr.log
Come iniziare un nuovo progetto Django