Le app Django eseguite nell'ambiente standard di App Engine scalano in modo dinamico a seconda del traffico.
Questo tutorial presuppone che tu abbia familiarità con lo sviluppo web di Django. Se non hai mai utilizzato lo sviluppo di Django, è una buona idea lavorare scrivere la tua prima app Django prima di continuare.
Sebbene questo tutorial mostri nello specifico Django, puoi usare questo processo di deployment con altri framework basati su Django, come Wagtail e Django CMS.
Questo tutorial utilizza Django 4, che richiede almeno Python 3.8. Lo standard di App Engine supporta Python 3.7 e versioni successive, incluso Python 3.8.
Obiettivi
In questo tutorial, imparerai a:
- Creare e connettere un database Cloud SQL.
- Crea e utilizza i valori dei secret di Secret Manager.
- Esegui il deployment di un'app Django nell'ambiente standard di App Engine.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Prima di iniziare
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Abilita le API Cloud SQL Admin API, Secret Manager, and Cloud Build.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Se non l'hai ancora fatto, inizializza App Engine e seleziona la regione che preferisci:
gcloud app create
prepara l'ambiente
Clona un'app di esempio
Il codice dell'app di esempio Django è GoogleCloudPlatform/python-docs-samples su GitHub.
Puoi scaricare l'anteprima come file ZIP ed estrailo o clona il repository nella tua macchina locale:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Vai alla directory che contiene il codice di esempio:
Linux/macOS
cd python-docs-samples/appengine/standard_python3/django
Windows
cd python-docs-samples\appengine\standard_python3\django
Conferma la configurazione di Python
Questo tutorial si basa su Python per eseguire l'applicazione di esempio sulla tua macchina. Il codice campione richiede anche l'installazione delle dipendenze
Per ulteriori dettagli, consulta la guida dell'ambiente di sviluppo Python.
Verifica che il tuo Python sia almeno alla versione 3.8.
python -V
Dovresti vedere
Python 3.8.0
o un valore superiore.Crea un ambiente virtuale Python e installa le dipendenze:
Linux/macOS
python -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt
Windows
python -m venv venv venv\scripts\activate pip install --upgrade pip pip install -r requirements.txt
Scarica il proxy di autenticazione Cloud SQL per connetterti a Cloud SQL dalla macchina locale
Una volta eseguito il deployment, l'app utilizza il proxy di autenticazione Cloud SQL integrato l'ambiente standard App Engine per comunicare con il tuo Cloud SQL in esecuzione in un'istanza Compute Engine. Tuttavia, per testare la tua app localmente, devi installare e utilizzare una del proxy nel tuo ambiente di sviluppo. Per ulteriori dettagli, consulta Guida al proxy di autenticazione Cloud SQL.
Il proxy di autenticazione Cloud SQL utilizza l'API Cloud SQL per interagire con l'istanza SQL. Per farlo, richiede l'autenticazione dell'applicazione tramite gcloud CLI.
Autentica e acquisisci le credenziali per l'API:
gcloud auth application-default login
Scarica e installa il proxy di autenticazione Cloud SQL sulla macchina locale.
Linux a 64 bit
- Scarica il proxy di autenticazione Cloud SQL:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.12.0/cloud-sql-proxy.linux.amd64
- Rendi eseguibile il proxy di autenticazione Cloud SQL:
chmod +x cloud-sql-proxy
Linux a 32 bit
- Scarica il proxy di autenticazione Cloud SQL:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.12.0/cloud-sql-proxy.linux.386
- Se il comando
curl
non viene trovato, eseguisudo apt install curl
e ripeti il comando di download. - Rendi eseguibile il proxy di autenticazione Cloud SQL:
chmod +x cloud-sql-proxy
macOS a 64 bit
- Scarica il proxy di autenticazione Cloud SQL:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.12.0/cloud-sql-proxy.darwin.amd64
- Rendi eseguibile il proxy di autenticazione Cloud SQL:
chmod +x cloud-sql-proxy
Mac M1
- Scarica il proxy di autenticazione Cloud SQL:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.12.0/cloud-sql-proxy.darwin.arm64
- Rendi eseguibile il proxy di autenticazione Cloud SQL:
chmod +x cloud-sql-proxy
Windows a 64 bit
Clic destro https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.12.0/cloud-sql-proxy.x64.exe e seleziona Salva link con nome per scaricare il proxy di autenticazione Cloud SQL. Rinomina il file comecloud-sql-proxy.exe
.Windows a 32 bit
Clic destro https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.12.0/cloud-sql-proxy.x86.exe e seleziona Salva link con nome per scaricare il proxy di autenticazione Cloud SQL. Rinomina il file comecloud-sql-proxy.exe
.Immagine Docker del proxy di autenticazione Cloud SQL
Il proxy di autenticazione Cloud SQL ha immagini container diverse, ad esempio
distroless
,alpine
, ebuster
. L'immagine container proxy di autenticazione Cloud SQL predefinita utilizzadistroless
, che non contiene alcuna shell. Se hai bisogno di una shell o di strumenti correlati, scarica un'immagine basata sualpine
obuster
. Per ulteriori informazioni, vedi Immagini container del proxy di autenticazione Cloud SQL.Puoi eseguire il pull dell'immagine più recente sulla tua macchina locale utilizzando Docker, utilizzando questo comando:
docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.12.0
Altro sistema operativo
Per altri sistemi operativi non inclusi qui, puoi compilare il proxy di autenticazione Cloud SQL dall'origine.Puoi scegliere di spostare il download in una posizione comune, ad esempio in una posizione su
PATH
o nella tua directory home. Se scegli di farlo, quando avvii il proxy di autenticazione Cloud SQL più avanti nel tutorial, ricordati di fare riferimento alla posizione scelta quando utilizzi i comandicloud_sql_proxy
.- Scarica il proxy di autenticazione Cloud SQL:
Crea servizi di supporto
Questo tutorial utilizza diversi servizi Google Cloud per fornire di archiviazione dei contenuti multimediali e dei secret che supportano Django di cui è stato eseguito il deployment progetto. Il deployment di questi servizi viene eseguito in una regione specifica. Per l'efficienza tra il deployment di tutti i servizi deve essere eseguito nella stessa regione. Per ulteriori informazioni sulla regione più vicina a te, vedi Prodotti disponibili per regione.
Questo tutorial utilizza i meccanismi integrati di hosting di asset statici nell'ambiente standard di App Engine.Configura un'istanza Cloud SQL per PostgreSQL
Django supporta ufficialmente più database relazionali, ma offre per PostgreSQL. PostgreSQL è supportato da Cloud SQL, quindi questo il tutorial sceglie di utilizzare quel tipo di database.
La seguente sezione descrive la creazione di un'istanza, un database e un utente del database PostgreSQL per l'app.
Crea l'istanza PostgreSQL:
Console
Nella console Google Cloud, vai alla pagina Istanze Cloud SQL.
Fai clic su Crea istanza.
Fai clic su PostgreSQL.
Nel campo ID istanza, inserisci
INSTANCE_NAME
.Inserisci una password per l'utente postgres.
Mantieni i valori predefiniti per gli altri campi.
Fai clic su Crea.
Sono necessari alcuni minuti per creare l'istanza e renderla pronta per l'uso.
gcloud
Crea l'istanza PostgreSQL:
gcloud sql instances create INSTANCE_NAME \ --project PROJECT_ID \ --database-version POSTGRES_13 \ --tier db-f1-micro \ --region REGION
Sostituisci quanto segue:
INSTANCE_NAME
: il nome dell'istanza Cloud SQLPROJECT_ID
: l'ID del progetto Google CloudREGION
: la regione Google Cloud
Sono necessari alcuni minuti per creare l'istanza e renderla pronta per l'uso.
All'interno dell'istanza creata, crea un database:
Console
- Nella pagina dell'istanza, vai alla scheda Database.
- Fai clic su Crea database.
- Nella finestra di dialogo Nome database, inserisci
DATABASE_NAME
. - Fai clic su Crea.
gcloud
Crea il database all'interno dell'istanza creata di recente:
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAME
Sostituisci
DATABASE_NAME
con un nome per il database all'interno dell'istanza.
Crea un utente del database:
Console
- Nella pagina dell'istanza, vai alla scheda Utenti.
- Fai clic su Aggiungi account utente.
- Nella finestra di dialogo Aggiungi un account utente all'istanza in "Autenticazione integrata":
- Inserisci il nome utente
DATABASE_USERNAME
. - Inserisci la password
DATABASE_PASSWORD
- Fai clic su Aggiungi.
gcloud
Crea l'utente nell'istanza creata di recente:
gcloud sql users create DATABASE_USERNAME \ --instance INSTANCE_NAME \ --password DATABASE_PASSWORD
Sostituisci
PASSWORD
con una password sicura.
Archivia i valori dei secret in Secret Manager
Ora che i servizi di supporto sono configurati, Django deve informazioni su questi servizi. Invece di inserire questi valori direttamente nel codice sorgente di Django, questo tutorial utilizza Secret Manager per archiviare queste informazioni in modo sicuro.
L'ambiente standard di App Engine interagisce con i secret mediante la sua account di servizio.Crea un file di ambiente Django come secret di Secret Manager
Archivia le impostazioni necessarie per avviare Django in un file env protetto.
L'app di esempio utilizza l'API Secret Manager per recuperare il secret
e il valore di django-environ
per caricare i valori nell'ambiente Django. Il secret è configurato
sia accessibile dallo standard di App Engine.
Crea un file denominato
.env
, che definisce la stringa di connessione al database, il nome del bucket multimediale e un nuovo valoreSECRET_KEY
:echo DATABASE_URL=postgres://DATABASE_USERNAME:DATABASE_PASSWORD@//cloudsql/PROJECT_ID:REGION:INSTANCE_NAME/DATABASE_NAME > .env echo GS_BUCKET_NAME=PROJECT_ID_MEDIA_BUCKET >> .env echo SECRET_KEY=$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1) >> .env
Archivia il secret in Secret Manager:
Console
Nella console Google Cloud, vai alla pagina Secret Manager.
Fai clic su Crea secret.
Nel campo Nome, inserisci
django_settings
.Nella finestra di dialogo Valore secret, incolla i contenuti del file
.env
.Fai clic su Crea secret.
Elimina il file locale per impedire le sostituzioni delle impostazioni locali.
gcloud
Crea un nuovo secret,
django_settings
, con il valore del file.env
:gcloud secrets create django_settings --data-file .env
Per confermare la creazione del secret, selezionalo:
gcloud secrets describe django_settings gcloud secrets versions access latest --secret django_settings
Elimina il file locale per impedire le sostituzioni delle impostazioni locali:
rm .env
Configura l'accesso al secret:
Console
- Fai clic sulla scheda Autorizzazioni.
- Fai clic su Aggiungi.
- Nel campo Nuovi membri, inserisci
PROJECT_ID@appspot.gserviceaccount.com
e premiEnter
. - Nel menu a discesa Ruolo, seleziona Funzione di accesso al secret di Secret Manager.
- Fai clic su Salva.
gcloud
Concedi l'accesso al secret all'account di servizio standard di App Engine:
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
Esecuzione dell'applicazione nel computer locale
Con i servizi di supporto configurati, ora puoi eseguire l'app sul tuo computer. Questa configurazione consente lo sviluppo locale, la creazione di un super user e l'applicazione di migrazioni dei database.
In un terminale separato, avvia il proxy di autenticazione Cloud SQL:
Linux/macOS
./cloud-sql-proxy PROJECT_ID:REGION:INSTANCE_NAME
Windows
cloud-sql-proxy.exe PROJECT_ID:REGION:INSTANCE_NAME
Questo passaggio stabilisce una connessione dal tuo computer locale al tuo Cloud SQL per scopi di test locali. Mantieni il valore Il proxy di autenticazione Cloud SQL viene eseguito per tutta la durata del test locale dell'app. Esecuzione questa procedura in un terminale separato vi consente di continuare a lavorare questo processo viene eseguito.
Nel terminale originale, imposta l'ID progetto localmente (utilizzato dall'API Secret Manager):
Linux/macOS
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Windows
set GOOGLE_CLOUD_PROJECT=PROJECT_ID
Imposta una variabile di ambiente per indicare che stai utilizzando il proxy di autenticazione Cloud SQL (questo valore è riconosciuto nel codice):
Linux/macOS
export USE_CLOUD_SQL_AUTH_PROXY=true
Windows
set USE_CLOUD_SQL_AUTH_PROXY=true
Esegui le migrazioni di Django per configurare i tuoi modelli e asset:
python manage.py makemigrations python manage.py makemigrations polls python manage.py migrate python manage.py collectstatic
Avvia il server web Django:
python manage.py runserver 8080
Nel browser, vai all'indirizzo http://localhost:8080.
Se sei in Cloud Shell, fai clic sul pulsante Anteprima web e seleziona Anteprima sulla porta 8080.
Nella pagina viene visualizzato il seguente testo: "Hello World. Stai presso l'indice dei sondaggi". Il server web Django in esecuzione sul tuo computer fornisce le pagine di esempio dell'app.
Premi
Ctrl
/Cmd
+C
per arrestare il server web locale.
Utilizzare la Console di amministrazione di Django
Per accedere alla Console di amministrazione di Django, devi creare un super user. Poiché disponi di una connessione al database accessibile in locale, puoi eseguire i comandi di gestione:
Creare un super user. Ti verrà chiesto di inserire nome utente, email e password.
python manage.py createsuperuser
Avvia un server web locale:
python manage.py runserver
Nel browser, vai a http://localhost:8000/admin.
Accedi al sito di amministrazione con il nome utente e la password che hai utilizzato quando hai corso
createsuperuser
.
Esegui il deployment dell'app nell'ambiente standard di App Engine
Dopo aver configurato tutti i servizi di supporto e aver testato l'applicazione in locale, ora puoi eseguire il deployment dell'app nell'ambiente standard di App Engine:
- Carica l'app eseguendo questo comando, che esegue il deployment dell'app come descritto in
app.yaml
e imposta la versione di cui è stato eseguito il deployment come predefinita, in modo che gestisca tutto il nuovo traffico:gcloud app deploy
- Conferma le impostazioni digitando "sì" quando richiesto.
- Attendi il messaggio che ti informa che l'aggiornamento è stato completato.
- Apri
app.yaml
e aggiorna il valore diAPPENGINE_URL
con l'URL di cui hai eseguito il deployment:... env_variables: APPENGINE_URL: https://PROJECT_ID.uc.r.appspot.com
- Carica le modifiche alla configurazione:
gcloud app deploy
Esecuzione dell'app di cui è stato eseguito il deployment
È stato eseguito il deployment dell'app ed è ora possibile accedervi:
Apri il sito web di cui è stato eseguito il deployment:
gcloud app browse
In alternativa, visualizza l'URL e aprilo manualmente:
gcloud app describe --format "value(defaultHostname)"
La richiesta viene fornita da un server web in esecuzione nell'ambiente standard App Engine.
Aggiornamento dell'applicazione
Per aggiornare l'applicazione, apporta modifiche al codice ed esegui di nuovo il comando gcloud app deploy
.
Il deployment crea un'istanza nuova versione della tua app e la promuoverà alla versione predefinita. Le versioni precedenti le app rimanenti. Tutte queste versioni dell'app sono risorse fatturabili. Per ridurre i costi, Eliminare le versioni non predefinite dell'app.
Configurazione per la produzione
Ora hai un deployment di Django funzionante, ma puoi intraprendere ulteriori passaggi per assicurarti che la tua applicazione sia pronta per la produzione.
Disattiva debug
Verifica che la variabile DEBUG
in mysite/settings.py
sia impostata su False
. Questo
le pagine di errore dettagliate non verranno mostrate all'utente, il che potrebbe divulgare informazioni sulle configurazioni.
Limita i privilegi utente del database
Tutti gli utenti creati mediante Cloud SQL dispongono dei privilegi associati
Ruolo cloudsqlsuperuser
:
CREATEROLE
, CREATEDB
e LOGIN
.
Per impedire all'utente del database Django di avere queste autorizzazioni, crea manualmente l'utente in PostgreSQL. Devi avere installato il terminale interattivo psql
oppure utilizzare Cloud Shell, su cui è preinstallato questo strumento.
Console
-
In the Google Cloud console, activate Cloud Shell.
In Cloud Shell, utilizza il terminale integrato per connetterti alla tua istanza
INSTANCE_NAME
:gcloud sql connect INSTANCE_NAME --user postgres
Inserisci la password dell'utente postgres.
Ora stai utilizzando
psql
. Dovresti vedere il promptpostgres=>
.Creare un utente:
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
Sostituisci
PASSWORD
con una password univoca e casuale.Concedi i diritti completi sul nuovo database al nuovo utente:
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
Esci da
psql
:\q
gcloud
Avvia una connessione all'istanza SQL:
gcloud sql connect INSTANCE_NAME --user postgres
Sostituisci
INSTANCE_NAME
con l'istanza Cloud SQL creata.Inserisci la password dell'utente postgres.
Ora stai utilizzando
psql
. Dovresti vedere il promptpostgres=>
.Creare un utente:
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';
Concedi i diritti completi sul nuovo database al nuovo utente:
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;
Esci da
psql
:\q
comprendi il codice
Applicazione di esempio
L'app di esempio di Django è stata creata utilizzando gli strumenti di Django standard. I comandi seguenti creano il progetto e l'app di polling:
django-admin startproject mysite
python manage.py startapp polls
Le visualizzazioni di base, i modelli e le configurazioni dei percorsi sono stati copiati da Scrittura della tua prima app Django (Parte 1 e la Parte 2).
Secret di Secret Manager
Il file settings.py
contiene codice che utilizza l'API Python di Secret Manager per recuperare la versione più recente del secret denominato e inserirlo nell'ambiente (utilizzando django-environ
):
Il secret viene utilizzato per archiviare più valori del secret al fine di ridurre il numero di secret diversi da configurare.
Configurazioni CSRF
Django dispone di protezione integrata contro la falsificazione di richieste cross-site (CSRF). A partire da Django 4.0, le modifiche al funzionamento implicano che è importante comunicare a Django l'URL ospitato, per offrire le migliori protezioni agli utenti che inviano dati.
Devi fornire l'URL dell'app come variabile di ambiente nel file settings.py
Si tratta del valore utilizzato da Django per le impostazioni pertinenti.
Override dei secret locali
Se nel file system locale viene trovato un file .env
, viene utilizzato al posto del valore di Secret Manager. La creazione di un file .env
in locale può essere utile per i test locali (ad es. lo sviluppo locale rispetto a un database SQLite o altre impostazioni locali).
Connessione al database
Il file settings.py
contiene la configurazione del tuo database SQL. Usa l'helper env.db()
da django-environ
per caricare la stringa di connessione impostata in DATABASE_URL
nell'impostazione DATABASES
.
Quando si esegue l'applicazione in locale e si utilizza il proxy di autenticazione Cloud SQL per accedere
database ospitato, il flag USE_CLOUD_SQL_AUTH_PROXY
regola il database
impostazioni per utilizzare il proxy.
Contenuti statici ospitati
La app.yaml
contiene le informazioni di configurazione per il deployment in App Engine.
Questo file app.yaml
specifica che App Engine gestisce i file statici
dalla directory static/
:
Quando esegui l'app in locale con DEBUG
abilitato, questi file vengono pubblicati localmente da Django:
Esegui la pulizia
Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina il progetto
- Nella console Google Cloud, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.
Passaggi successivi
- Scopri come configurare PostgreSQL per la produzione
- Scopri di più su Django su Google Cloud