Distribuire un'app Web Python (Django o Flask) con PostgreSQL in Azure

In questa esercitazione si distribuirà un'app Web Python guidata dai dati (Django o Flask) nel servizio app Azure con il servizio di database relazionale Database di Azure per PostgreSQL. supporto del servizio app AzurePython in un ambiente server Linux.

An architecture diagram showing an App Service with a PostgreSQL database in Azure.

Per completare questa esercitazione, è necessario:

Vai alla fine

Con l'interfaccia della riga di comando per sviluppatori di Azure installata, è possibile distribuire un'app di esempio completamente configurata illustrata in questa esercitazione e visualizzarla in esecuzione in Azure. È sufficiente eseguire i comandi seguenti in una directory di lavoro vuota:

azd auth login
azd init --template msdocs-flask-postgresql-sample-app
azd up

Applicazione di esempio

Sono disponibili applicazioni Python di esempio che usano il framework Flask e Django per seguire questa esercitazione. Per distribuirli senza eseguirli in locale, ignorare questa parte.

Per eseguire l'applicazione in locale, assicurarsi di avere Python 3.7 o versione successiva e PostgreSQL installato in locale. Clonare quindi il ramo del repository di starter-no-infra esempio e passare alla radice del repository.

git clone -b starter-no-infra https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app
cd msdocs-flask-postgresql-sample-app

Creare un file con estensione env come illustrato di seguito usando il file .env.sample come guida. Impostare il valore di DBNAME sul nome di un database esistente nell'istanza locale di PostgreSQL. Impostare i valori di DBHOST, DBUSERe DBPASS in base alle esigenze dell'istanza di PostgreSQL locale.

DBNAME=<database name>
DBHOST=<database-hostname>
DBUSER=<db-user-name>
DBPASS=<db-password>

Creare un ambiente virtuale per l'app:

py -m venv .venv
.venv\scripts\activate

Installare le dipendenze:

pip install -r requirements.txt

Eseguire l'applicazione di esempio con i comandi seguenti:

# Run database migration
flask db upgrade
# Run the app at http://127.0.0.1:5000
flask run

1. Creare servizio app e PostgreSQL

git clone https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app.git

In questo passaggio si creano le risorse di Azure. I passaggi usati in questa esercitazione creano un set di risorse protette per impostazione predefinita che includono servizio app e Database di Azure per PostgreSQL. Per il processo di creazione, specificare:

  • Nome dell'app Web. È il nome usato come parte del nome DNS per l'app Web sotto forma di https://<app-name>.azurewebsites.net.
  • Area in cui eseguire l'app fisicamente nel mondo.
  • Stack di runtime per l'app. È qui che si seleziona la versione di Python da usare per l'app.
  • Piano di hosting per l'app. Si tratta del piano tariffario che include il set di funzionalità e la capacità di ridimensionamento per l'app.
  • Gruppo di risorse per l'app. Un gruppo di risorse consente di raggruppare (in un contenitore logico) tutte le risorse di Azure necessarie per l'applicazione.

Accedere al portale di Azure e seguire questa procedura per creare le risorse del servizio app Azure.

Passaggio 1: nel portale di Azure:

  1. Immettere "database dell'app Web" nella barra di ricerca nella parte superiore del portale di Azure.
  2. Selezionare l'elemento con etichetta App Web e database sotto l'intestazione Marketplace . È anche possibile passare direttamente alla creazione guidata .

A screenshot showing how to use the search box in the top tool bar to find the Web App + Database creation wizard (Flask).

Passaggio 2: nella pagina Crea app Web e database compilare il modulo come indicato di seguito.

  1. Gruppo di risorse → Selezionare Crea nuovo e usare un nome msdocs-python-postgres-tutorial.
  2. Area → Qualsiasi area di Azure nelle vicinanze.
  3. Nomemsdocs-python-postgres-XYZ dove XYZ è costituito da tre caratteri casuali. Il nome deve essere univoco in Azure
  4. Stack di runtime → Python 3.10.
  5. DatabasePostgreSQL - Server flessibile è selezionato per impostazione predefinita come motore di database. Anche il nome del server e il nome del database vengono impostati per impostazione predefinita sui valori appropriati.
  6. Piano di hosting → Basic. Quando si è pronti, è possibile passare a un piano tariffario di produzione in un secondo momento.
  7. Selezionare Rivedi e crea.
  8. Al termine della convalida selezionare Crea.

A screenshot showing how to configure a new app and database in the Web App + Database wizard (Flask).

Passaggio 3: il completamento della distribuzione richiede alcuni minuti. Al termine della distribuzione, selezionare il pulsante Vai alla risorsa . Si accede direttamente all'app servizio app, ma vengono create le risorse seguenti:

  • Gruppo di risorse → Contenitore per tutte le risorse create.
  • servizio app piano → Definisce le risorse di calcolo per servizio app. Viene creato un piano Linux nel livello Basic .
  • servizio app → Rappresenta l'app ed è in esecuzione nel piano di servizio app.
  • Rete virtuale → Integrata con l'app servizio app e isola il traffico di rete back-end.
  • Database di Azure per PostgreSQL server flessibile → Accessibile solo dall'interno della rete virtuale. Nel server vengono creati un database e un utente.
  • DNS privato zona → Abilita la risoluzione DNS del server PostgreSQL nella rete virtuale.

A screenshot showing the deployment process completed (Flask).

2. Verificare le impostazioni di connessione

La creazione guidata ha generato le variabili di connettività già come impostazioni dell'app. Le impostazioni dell'app sono un modo per mantenere i segreti di connessione all'esterno del repository di codice. Quando si è pronti a spostare i segreti in una posizione più sicura, ecco un articolo sull'archiviazione in Azure Key Vault.

Passaggio 1: nella pagina servizio app selezionare Configurazione nel menu a sinistra.

A screenshot showing how to open the configuration page in App Service (Flask).

Passaggio 2: nella scheda Impostazioni applicazione della pagina Configurazione verificare che AZURE_POSTGRESQL_CONNECTIONSTRING sia presente. Che verrà inserito nell'ambiente di runtime come variabile di ambiente.

A screenshot showing how to see the autogenerated connection string (Flask).

Passaggio 3: In un terminale o un prompt dei comandi eseguire lo script Python seguente per generare un segreto univoco: python -c 'import secrets; print(secrets.token_hex())'. Copiare il valore di output da usare nel passaggio successivo.

3. Distribuire il codice di esempio

In questo passaggio si configurerà la distribuzione di GitHub usando GitHub Actions. È solo uno dei molti modi per eseguire la distribuzione in servizio app, ma anche un ottimo modo per avere l'integrazione continua nel processo di distribuzione. Per impostazione predefinita, ogni git push repository GitHub avvia l'azione di compilazione e distribuzione.

Passaggio 1: In una nuova finestra del browser:

  1. Accedi all'account GitHub.
  2. Accedere a https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app.
  3. Seleziona Fork.
  4. Selezionare Crea fork.

A screenshot showing how to create a fork of the sample GitHub repository (Flask).

Passaggio 2: nella pagina GitHub aprire Visual Studio Code nel browser premendo il . tasto .

A screenshot showing how to open the Visual Studio Code browser experience in GitHub (Flask).

Passaggio 3: In Visual Studio Code nel browser aprire azureproject/production.py nell'elenco delle cartelle. Vedere le variabili di ambiente usate nell'ambiente di produzione, incluse le impostazioni dell'app visualizzate nella pagina di configurazione.

A screenshot showing Visual Studio Code in the browser and an opened file (Flask).

Passaggio 4: Tornare alla pagina servizio app, nel menu a sinistra selezionare Centro distribuzione.

A screenshot showing how to open the deployment center in App Service (Flask).

Passaggio 5: Nella pagina Centro distribuzione:

  1. In Origine selezionare GitHub. Per impostazione predefinita, GitHub Actions è selezionato come provider di compilazione.
  2. Accedere all'account GitHub e seguire la richiesta di autorizzare Azure.
  3. In Organizzazione selezionare l'account.
  4. In Repository selezionare msdocs-flask-postgresql-sample-app.
  5. In Ramo selezionare main.
  6. Mantenere selezionata l'opzione predefinita per Aggiungere un flusso di lavoro.
  7. In Tipo di autenticazione selezionare Identità assegnata dall'utente.
  8. Nel menu in alto selezionare Salva. servizio app esegue il commit di un file del flusso di lavoro nel repository GitHub scelto, nella .github/workflows directory .

A screenshot showing how to configure CI/CD using GitHub Actions (Flask).

Passaggio 6: Nella pagina Centro distribuzione:

  1. Selezionare Log. È già stata avviata un'esecuzione di distribuzione.
  2. Nell'elemento di log per l'esecuzione della distribuzione selezionare Compila/Distribuisci log.

A screenshot showing how to open deployment logs in the deployment center (Flask).

Passaggio 7: Si è eseguiti nel repository GitHub e si noterà che l'azione GitHub è in esecuzione. Il file del flusso di lavoro definisce due fasi separate, compilare e distribuire. Attendere che l'esecuzione di GitHub mostri lo stato Completato. Ci vogliono circa 5 minuti.

A screenshot showing a GitHub run in progress (Flask).

Problemi? Consultare la guida alla risoluzione dei problemi.

4. Generare lo schema del database

Con il database PostgreSQL protetto dalla rete virtuale, il modo più semplice per eseguire le migrazioni del database Flask è in una sessione SSH con il contenitore servizio app.

Passaggio 1: Tornare alla pagina servizio app, nel menu a sinistra,

  1. Selezionare SSH.
  2. Selezionare Vai.

A screenshot showing how to open the SSH shell for your app from the Azure portal (Flask).

Passaggio 2: Nel terminale SSH eseguire flask db upgrade. Se ha esito positivo, servizio app si connette correttamente al database. Solo le modifiche apportate ai file in /home possono essere mantenute oltre i riavvii dell'app. Le modifiche al di fuori di /home non sono persistenti.

A screenshot showing the commands to run in the SSH shell and their output (Flask).

5. Passare all'app

Passaggio 1: Nella pagina servizio app:

  1. Nel menu a sinistra selezionare Panoramica.
  2. Selezionare l'URL dell'app. È anche possibile passare direttamente a https://<app-name>.azurewebsites.net.

A screenshot showing how to launch an App Service from the Azure portal (Flask).

Passaggio 2: Aggiungere alcuni ristoranti all'elenco. Si sta eseguendo un'app Web nel servizio app Azure, con connettività sicura a Database di Azure per PostgreSQL.

A screenshot of the Flask web app with PostgreSQL running in Azure showing restaurants and restaurant reviews (Flask).

6. Trasmettere i log di diagnostica

app Azure Servizio acquisisce tutti i messaggi di output nella console per diagnosticare i problemi relativi all'applicazione. L'app di esempio include print() istruzioni per illustrare questa funzionalità, come illustrato di seguito.

@app.route('/', methods=['GET'])
def index():
    print('Request for index page received')
    restaurants = Restaurant.query.all()
    return render_template('index.html', restaurants=restaurants)

Passaggio 1: Nella pagina servizio app:

  1. Nel menu a sinistra selezionare servizio app log.
  2. In Registrazione applicazioni selezionare File System.
  3. Nel menu in alto selezionare Salva.

A screenshot showing how to enable native logs in App Service in the Azure portal.

Passaggio 2: Dal menu a sinistra selezionare Flusso di log. Vengono visualizzati i log per l'app, inclusi i log e i log della piattaforma dall'interno del contenitore.

A screenshot showing how to view the log stream in the Azure portal.

Altre informazioni sulla registrazione nelle app Python nella serie sulla configurazione di Monitoraggio di Azure per l'applicazione Python.

7. Pulire le risorse

Al termine, è possibile eliminare tutte le risorse dalla sottoscrizione di Azure eliminando il gruppo di risorse.

Passaggio 1: Nella barra di ricerca nella parte superiore del portale di Azure:

  1. Immettere il nome del gruppo di risorse.
  2. Selezionare il gruppo di risorse.

A screenshot showing how to search for and navigate to a resource group in the Azure portal.

Passaggio 2: Nella pagina del gruppo di risorse selezionare Elimina gruppo di risorse.

A screenshot showing the location of the Delete Resource Group button in the Azure portal.

Passaggio 3:

  1. Immettere il nome del gruppo di risorse per confermare l'eliminazione.
  2. Selezionare Elimina.

A screenshot of the confirmation dialog for deleting a resource group in the Azure portal. :

1. Creare risorse di Azure e distribuire un'app di esempio

In questo passaggio si creano le risorse di Azure e si distribuisce un'app di esempio in servizio app in Linux. I passaggi usati in questa esercitazione creano un set di risorse protette per impostazione predefinita che includono servizio app e Database di Azure per PostgreSQL.

  1. Se non è già stato fatto, clonare il ramo del repository di starter-no-infra esempio in un terminale locale.

    git clone -b starter-no-infra https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app
    cd msdocs-flask-postgresql-sample-app
    

    Questo ramo clonato è il punto di partenza. Contiene una semplice applicazione Flask per unità dati.

  2. Dalla radice del repository eseguire azd init.

    azd init --template python-app-service-postgresql-infra
    
  3. Quando richiesto, fornire le risposte seguenti:

    Domanda Risposta
    La directory corrente non è vuota. Inizializzare un progetto qui in '<your-directory>'? Y
    Cosa vuoi fare con questi file? Mantenere invariati i file esistenti
    Immettere un nuovo nome di ambiente Digitare un nome univoco. Il modello azd usa questo nome come parte del nome DNS dell'app Web in Azure (<app-name>.azurewebsites.net). Sono consentiti caratteri alfanumerici e trattini.
  4. Eseguire il comando per effettuare il azd up provisioning delle risorse di Azure necessarie e distribuire il codice dell'app. Se non si è già connessi ad Azure, verrà avviato il browser e verrà chiesto di eseguire l'accesso. Il azd up comando richiederà anche di selezionare la sottoscrizione e il percorso desiderati in cui eseguire la distribuzione.

    azd up
    

    Il completamento del azd up comando potrebbe richiedere alcuni minuti. Compila e distribuisce anche il codice dell'applicazione, ma il codice verrà modificato in un secondo momento per lavorare con servizio app. Durante l'esecuzione, il comando fornisce messaggi sul processo di provisioning e distribuzione, incluso un collegamento alla distribuzione in Azure. Al termine, il comando visualizza anche un collegamento all'applicazione di distribuzione.

    Questo modello azd contiene file (azure.yaml e la directory infra ) che generano un'architettura secure-by-default con le risorse di Azure seguenti:

    • Gruppo di risorse → Contenitore per tutte le risorse create.
    • servizio app piano → Definisce le risorse di calcolo per servizio app. Viene specificato un piano Linux nel livello B1 .
    • servizio app → Rappresenta l'app ed è in esecuzione nel piano di servizio app.
    • Rete virtuale → Integrata con l'app servizio app e isola il traffico di rete back-end.
    • Database di Azure per PostgreSQL server flessibile → Accessibile solo dall'interno della rete virtuale. Nel server vengono creati un database e un utente.
    • DNS privato zona → Abilita la risoluzione DNS del server PostgreSQL nella rete virtuale.
    • L'area di lavoro Log Analytics → funge da contenitore di destinazione per l'app per la spedizione dei log, in cui è anche possibile eseguire query sui log.

2. Utilizzare il database stringa di connessione

Il modello azd usato ha generato le variabili di connettività già come impostazioni dell'app e li restituisce al terminale per praticità. Le impostazioni dell'app sono un modo per mantenere i segreti di connessione all'esterno del repository di codice.

  1. Nell'output azd trovare le impostazioni dell'app e trovare le impostazioni AZURE_POSTGRESQL_CONNECTIONSTRING e AZURE_REDIS_CONNECTIONSTRING. Per proteggere i segreti, vengono visualizzati solo i nomi delle impostazioni. L'aspetto è simile al seguente nell'output azd:

     App Service app has the following settings:
    
             - AZURE_POSTGRESQL_CONNECTIONSTRING
             - AZURE_REDIS_CONNECTIONSTRING
             - FLASK_DEBUG
             - SCM_DO_BUILD_DURING_DEPLOYMENT
             - SECRET_KEY
     
  2. AZURE_POSTGRESQL_CONNECTIONSTRINGcontiene il stringa di connessione al database Postgres in Azure e AZURE_REDIS_CONNECTIONSTRING contiene il stringa di connessione nella cache Redis in Azure. È necessario usarli per connettersi al codice. Aprire azureproject/production.py, rimuovere il commento dalle righe seguenti e salvare il file:

    conn_str = os.environ['AZURE_POSTGRESQL_CONNECTIONSTRING']
    conn_str_params = {pair.split('=')[0]: pair.split('=')[1] for pair in conn_str.split(' ')}
    DATABASE_URI = 'postgresql+psycopg2://{dbuser}:{dbpass}@{dbhost}/{dbname}'.format(
        dbuser=conn_str_params['user'],
        dbpass=conn_str_params['password'],
        dbhost=conn_str_params['host'],
        dbname=conn_str_params['dbname']
    )
    

    Il codice dell'applicazione è ora configurato per connettersi al database PostgreSQL in Azure. Se si vuole, aprire app.py e vedere come viene usata la DATABASE_URI variabile di ambiente.

  3. Nel terminale eseguire azd deploy.

    azd deploy
    

4. Generare lo schema del database

Con il database PostgreSQL protetto dalla rete virtuale, il modo più semplice per eseguire le migrazioni del database Flask è in una sessione SSH con il contenitore servizio app.

  1. Nell'output azd trovare l'URL per la sessione SSH e passarvi nel browser. L'output è simile al seguente:

     Open SSH session to App Service container at: https://<app-name>.scm.azurewebsites.net/webssh/host
     
  2. Nel terminale SSH eseguire flask db upgrade. Se ha esito positivo, servizio app si connette correttamente al database.

    A screenshot showing the commands to run in the SSH shell and their output (Flask).

    Nota

    Solo le modifiche apportate ai file in /home possono essere mantenute oltre i riavvii dell'app. Le modifiche al di fuori di /home non sono persistenti.

5. Passare all'app

  1. Nell'output azd trovare l'URL dell'app e passarvi nel browser. L'URL è simile al seguente nell'output AZD:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: https://<app-name>.azurewebsites.net/
     
  2. Aggiungere alcuni ristoranti all'elenco.

    Si sta eseguendo un'app Web nel servizio app Azure, con connettività sicura a Database di Azure per PostgreSQL.

6. Trasmettere i log di diagnostica

app Azure Servizio può acquisire i log della console per diagnosticare i problemi relativi all'applicazione. Per praticità, il modello azd ha già abilitato la registrazione nel file system locale e li ha spediti a un'area di lavoro Log Analytics.

L'app di esempio include print() istruzioni per illustrare questa funzionalità, come illustrato nel frammento di codice seguente.

@app.route('/', methods=['GET'])
def index():
    print('Request for index page received')
    restaurants = Restaurant.query.all()
    return render_template('index.html', restaurants=restaurants)

Nell'output azd trovare il collegamento per trasmettere servizio app log e passare a esso nel browser. Il collegamento è simile al seguente nell'output azd:

Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream

Altre informazioni sulla registrazione nelle app Python nella serie sulla configurazione di Monitoraggio di Azure per l'applicazione Python.

7. Pulire le risorse

Per eliminare tutte le risorse di Azure nell'ambiente di distribuzione corrente, eseguire azd down.

azd down

Risoluzione dei problemi

Di seguito sono elencati i problemi che possono verificarsi durante il tentativo di eseguire questa esercitazione e i passaggi per risolverli.

Non è possibile connettersi alla sessione SSH

Se non è possibile connettersi alla sessione SSH, l'app stessa non è stata avviata. Controllare i log di diagnostica per informazioni dettagliate. Ad esempio, se viene visualizzato un errore simile KeyError: 'AZURE_POSTGRESQL_CONNECTIONSTRING'a , potrebbe significare che la variabile di ambiente è mancante (potrebbe essere stata rimossa l'impostazione dell'app).

Viene visualizzato un errore durante l'esecuzione di migrazioni di database

Se si verificano errori relativi alla connessione al database, verificare se le impostazioni dell'app (AZURE_POSTGRESQL_CONNECTIONSTRING) sono state modificate. Senza tale stringa di connessione, il comando migrate non può comunicare con il database.

Domande frequenti

Quanto costa questa configurazione?

I prezzi per le risorse create sono i seguenti:

  • Il piano di servizio app viene creato nel livello Basic e può essere ridimensionato o ridotto. Vedere Prezzi del servizio app.
  • Il server flessibile PostgreSQL viene creato nel livello con burst più basso Standard_B1ms, con le dimensioni di archiviazione minime, che possono essere ridimensionate verso l'alto o verso il basso. Vedere i piani tariffari di Database di Azure per PostgreSQL.
  • La rete virtuale non comporta alcun addebito a meno che non si configurino funzionalità aggiuntive, ad esempio il peering. Vedere Prezzi di Azure Rete virtuale.
  • La zona DNS privata comporta un piccolo addebito. Vedere Prezzi di DNS di Azure.

Ricerca per categorie connettersi al server PostgreSQL protetto dietro la rete virtuale con altri strumenti?

  • Per l'accesso di base da uno strumento da riga di comando, è possibile eseguire psql dal terminale SSH dell'app.
  • Per connettersi da uno strumento desktop, la macchina deve trovarsi all'interno della rete virtuale. Ad esempio, potrebbe trattarsi di una macchina virtuale di Azure connessa a una delle subnet o di un computer in una rete locale con una connessione VPN da sito a sito con la rete virtuale di Azure.
  • È anche possibile integrare Azure Cloud Shell con la rete virtuale.

Come funziona lo sviluppo di app locali con GitHub Actions?

Usando il file del flusso di lavoro generato automaticamente da servizio app come esempio, viene avviata git push una nuova esecuzione di compilazione e distribuzione. Da un clone locale del repository GitHub si apportano gli aggiornamenti desiderati e si esegue il push in GitHub. Ad esempio:

git add .
git commit -m "<some-message>"
git push origin main

Come viene configurato l'esempio Django per l'esecuzione nel servizio app Azure?

Nota

Se si segue questa esercitazione con la propria app, esaminare la descrizione del file requirements.txt nel file README.md di ogni progetto (Flask, Django) per visualizzare i pacchetti necessari.

L'applicazione di esempio Django configura le impostazioni nel file azureproject/production.py in modo che possa essere eseguito nel servizio app Azure. Queste modifiche sono comuni alla distribuzione di Django nell'ambiente di produzione e non specifiche di servizio app.

  • Django convalida l'intestazione HTTP_HOST nelle richieste in ingresso. Il codice di esempio usa la WEBSITE_HOSTNAME variabile di ambiente in servizio app per aggiungere il nome di dominio dell'app all'impostazione ALLOWED_HOSTS di Django.

    # Configure the domain name using the environment variable
    # that Azure automatically creates for us.
    ALLOWED_HOSTS = [os.environ['WEBSITE_HOSTNAME']] if 'WEBSITE_HOSTNAME' in os.environ else []
    
  • Django non supporta la gestione dei file statici nell'ambiente di produzione. Per questa esercitazione, si userà WhiteNoise per abilitare la gestione dei file. Il pacchetto WhiteNoise è già stato installato con requirements.txt e il relativo middleware viene aggiunto all'elenco.

    
    # WhiteNoise configuration
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        # Add whitenoise middleware after the security middleware
        'whitenoise.middleware.WhiteNoiseMiddleware',
    

    Le impostazioni dei file statici vengono quindi configurate in base alla documentazione di Django.

    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
    

Per altre informazioni, vedere Impostazioni di produzione per le app Django.

Passaggi successivi

Passare all'esercitazione successiva per informazioni su come proteggere l'app con un dominio e un certificato personalizzati.

Vedere le informazioni sul modo in cui il Servizio app esegue un'app Python: