Självstudie: Distribuera en Django-webbapp med PostgreSQL i Azure App Service

Den här självstudien visar hur du distribuerar en datadriven Python Django-webbapp till Azure App Service och ansluter den till en Azure Database for Postgres-databas. Du kan också prova PostgresSQL – flexibel server genom att välja alternativet ovan. Flexibel server ger en enklare distributionsmekanism och lägre löpande kostnader.

I den här självstudien använder du Azure CLI för att utföra följande uppgifter:

  • Konfigurera din första miljö med Python och Azure CLI
  • Skapa en Azure Database for PostgreSQL databas
  • Distribuera kod till Azure App Service och ansluta till PostgreSQL
  • Uppdatera koden och distribuera om
  • Visa diagnostikloggar
  • Hantera webbappen i Azure Portal

Du kan också använda den Azure Portal i den här självstudien.

Den här självstudien visar hur du distribuerar en datadriven Python Django-webbapp till Azure App Service och ansluter den till en Azure Database for PostgreSQL Flexibel server-databas. Om du inte kan använda PostgreSQL – flexibel server väljer du alternativet Enskild server ovan.

I den här självstudien använder du Azure CLI för att utföra följande uppgifter:

  • Konfigurera din första miljö med Python och Azure CLI
  • Skapa en Azure Database for PostgreSQL flexible server-databas
  • Distribuera kod till Azure App Service och ansluta till PostgreSQL – flexibel server
  • Uppdatera koden och distribuera om
  • Visa diagnostikloggar
  • Hantera webbappen i Azure Portal

Du kan också använda den Azure Portal i den här självstudien.

1. Konfigurera din första miljö

  1. Ha ett Azure-konto med en aktiv prenumeration. Skapa ett konto utan kostnad.
  2. Installera Python 3.6 eller senare.
  3. Installera Azure CLI 2.18.0 eller senare, med vilken du kör kommandon i alla gränssnitt för att etablera och konfigurera Azure-resurser.

Öppna ett terminalfönster och kontrollera att din Python-version är 3.6 eller senare:

python3 --version

Kontrollera att din Azure CLI-version är 2.18.0 eller senare:

az --version

Om du behöver uppgradera kan du prova kommandot az upgrade (kräver version 2.11+) eller se Installera Azure CLI.

Logga sedan in på Azure via CLI:

az login

Det här kommandot öppnar en webbläsare för att samla in dina autentiseringsuppgifter. När kommandot har avslutats visas JSON-utdata som innehåller information om dina prenumerationer.

När du har loggat in kan du köra Azure-kommandon med Azure CLI för att arbeta med resurser i din prenumeration.

Har du problem? Berätta för oss.

2. Klona eller ladda ned exempelappen

Klona exempeldatabasen:

git clone https://github.com/Azure-Samples/djangoapp

Navigera sedan till den mappen:

cd djangoapp

För flexibel server använder du grenen flexible-server i exemplet, som innehåller några nödvändiga ändringar, till exempel hur databasserverns URL anges och lägger till i Django-databaskonfigurationen enligt vad som krävs av 'OPTIONS': {'sslmode': 'require'} Azure PostgreSQL – flexibel server.

git checkout flexible-server

Djangoapp-exemplet innehåller den datadrivna Django-avsökningsapp som du får genom att följa Skriva din första Django-app i Django-dokumentationen. Den färdiga appen finns här för din bekvämlighet.

Exemplet ändras också för att köras i en produktionsmiljö som App Service:

  • Produktionsinställningarna finns i filen azuresite/production.py. Utvecklingsinställningarna finns i azuresite/settings.py.
  • Appen använder produktionsinställningar när WEBSITE_HOSTNAME miljövariabeln anges. Azure App Service anger automatiskt den här variabeln till webbappens URL, till exempel msdocs-django.azurewebsites.net .

Produktionsinställningarna är specifika för att konfigurera Django att köras i alla produktionsmiljöer och är inte specifika för App Service. Mer information finns i checklistan för Django-distribution. Se även Produktionsinställningar för Django på Azure för mer information om några av ändringarna.

Har du problem? Berätta för oss.

3. Skapa En Postgres-databas i Azure

Installera db-up tillägget för Azure CLI:

az extension add --name db-up

Om kommandot az inte känns igen kontrollerar du att du har Installerat Azure CLI enligt beskrivningen i Konfigurera din första miljö.

Skapa sedan Postgres-databasen i Azure med az postgres up kommandot :

az postgres up --resource-group DjangoPostgres-tutorial-rg --location centralus --sku-name B_Gen5_1 --server-name <postgres-server-name> --database-name pollsdb --admin-user <admin-username> --admin-password <admin-password> --ssl-enforcement Enabled
  • Ersätta <postgres-server-name> med ett namn som är unikt i hela Azure (serverslutpunkten blir https://<postgres-server-name>.postgres.database.azure.com ). Ett bra mönster är att använda en kombination av företagets namn och ett annat unikt värde.
  • För <admin-username> och anger du <admin-password> autentiseringsuppgifter för att skapa en administratörsanvändare för den här Postgres-servern. Användarnamnet för administratören kan inte azure_superuser, azure_pg_admin, admin , administratör, rot, gäst eller offentlig. Det kan inte börja med att pg_. Lösenordet måste innehålla 8 till 128 tecken från tre av följande kategorier: engelska versala bokstäver, engelska gemena bokstäver, siffror (0 till 9) och icke-alfanumeriska tecken (till exempel !, #, %). Lösenordet får inte innehålla användarnamn.
  • Använd inte tecknet $ i användarnamnet eller lösenordet. Senare skapar du miljövariabler med dessa värden där tecknet har $ en särskild betydelse i Linux-containern som används för att köra Python-appar.
  • Prisnivån B_Gen5_1 (Basic, Gen5, 1 kärna) som används här är den billigaste. För produktionsdatabaser utelämnar du argumentet för --sku-name att GP_Gen5_2 (Generell användning, Gen 5, 2 kärnor) i stället.

Det här kommandot utför följande åtgärder, vilket kan ta några minuter:

  • Skapa en resursgrupp med DjangoPostgres-tutorial-rg namnet , om den inte redan finns.
  • Skapa en Postgres-server med namnet av --server-name argumentet .
  • Skapa ett administratörskonto med --admin-user argumenten --admin-password och . Du kan utelämna de här argumenten så att kommandot kan generera unika autentiseringsuppgifter åt dig.
  • Skapa en pollsdb databas med namnet av argumentet --database-name .
  • Aktivera åtkomst från din lokala IP-adress.
  • Aktivera åtkomst från Azure-tjänster.
  • Skapa en databasanvändare med åtkomst till pollsdb databasen.

Du kan göra alla steg separat med andra az postgres kommandon och , men gör alla steg psql az postgres up tillsammans.

När kommandot har slutförts matar det ut ett JSON-objekt som innehåller olika anslutningssträngar för databasen tillsammans med server-URL:en, ett genererat användarnamn (till exempel " ") och joyfulKoala@msdocs-djangodb-12345 ett GUID-lösenord. Kopiera användarnamnet och lösenordet till en temporär textfil eftersom du behöver dem senare i den här självstudien.

Tips

-l <location-name>, kan anges till vilken som helst av Azure-regionerna. Du kan hämta de regioner som är tillgängliga för din prenumeration med az account list-locations kommandot . För produktionsappar ska du placera din databas och din app på samma plats.

  1. Aktivera cachelagring av parametrar med Azure CLI så att du inte behöver ange dessa parametrar med varje kommando. (Cachelagrade värden sparas i mappen .azure.)

    az config param-persist on 
    
  2. Skapa en resursgrupp (du kan ändra namnet om du vill). Resursgruppens namn cachelagras och tillämpas automatiskt på efterföljande kommandon.

    az group create --name Python-Django-PGFlex-rg --location centralus
    
  3. Skapa databasservern (processen tar några minuter):

    az postgres flexible-server create --sku-name Standard_B1ms --public-access all
    

    Om kommandot inte känns igen måste du ha Azure CLI installerat enligt az beskrivningen i Konfigurera din första miljö.

    Kommandot az postgres flexible-server create utför följande åtgärder, vilket tar några minuter:

    • Skapa en standardresursgrupp om det inte redan finns ett cachelagrat namn.
    • Skapa en flexibel PostgreSQL-server:
      • Som standard använder kommandot ett genererat namn som server383813186 . Du kan ange ett eget namn med --name parametern . Namnet måste vara unikt i hela Azure.
      • Kommandot använder prisnivån med Standard_B1ms lägst kostnad. Utelämna argumentet --sku-name för att använda Standard_D2s_v3 standardnivån.
      • Kommandot använder resursgruppen och platsen som cachelagrades från föregående kommando, vilket az group create i det här exemplet är Python-Django-PGFlex-rg resursgruppen i centralus regionen.
    • Skapa ett administratörskonto med ett användarnamn och lösenord. Du kan ange dessa värden direkt med --admin-user --admin-password parametrarna och .
    • Skapa en databas med namnet flexibleserverdb som standard. Du kan ange ett databasnamn med --database-name parametern .
    • Ger fullständig offentlig åtkomst, som du kan styra med hjälp av --public-access parametern .
  4. När kommandot har slutförts kopierar du kommandots JSON-utdata till en fil eftersom du behöver värden från utdata senare i den här självstudien, särskilt värden, användarnamn och lösenord, tillsammans med databasnamnet.

Har du problem? Berätta för oss.

4. Distribuera koden till Azure App Service

I det här avsnittet skapar du en appvärd i App Service, ansluter den här appen till Postgres-databasen och distribuerar sedan koden till värden.

4.1 Skapa App Service appen

Kontrollera att du är i mappen djangoapp-lagringsplats som innehåller appkoden i terminalen.

Skapa en App Service -app (värdprocessen) med az webapp up kommandot :

az webapp up --resource-group DjangoPostgres-tutorial-rg --location centralus --plan DjangoPostgres-tutorial-plan --sku B1 --name <app-name>
  • För --location argumentet använder du samma plats som du gjorde för databasen i föregående avsnitt.
  • Ersätta <app-name> med ett unikt namn i hela Azure (serverslutpunkten är https://<app-name>.azurewebsites.net ). Tillåtna tecken <app-name> för A - Z är , 0 - 9 och - . Ett bra mönster är att använda en kombination av företagets namn och en appidentifierare.

Det här kommandot utför följande åtgärder, vilket kan ta några minuter:

  • Skapa resursgruppen om den inte redan finns. (I det här kommandot använder du samma resursgrupp som du skapade databasen i tidigare.)
  • Skapa App Service plan DjangoPostgres-tutorial-plan på prisnivån Basic (B1), om den inte finns. --plan och --sku är valfria.
  • Skapa App Service app om den inte finns.
  • Aktivera standardloggning för appen, om det inte redan är aktiverat.
  • Upload lagringsplatsen med ZIP-distribution med byggautomatisering aktiverat.
  • Cachelagra vanliga parametrar, till exempel namnet på resursgruppen och App Service plan, i filen .azure/config. Därför behöver du inte ange samma parameter med senare kommandon. Om du till exempel vill distribuera om appen när du har gjort ändringar kan du bara köra az webapp up igen utan några parametrar. Kommandon som kommer från CLI-tillägg, till exempel , använder dock för närvarande inte cacheminnet, vilket är anledningen till att du behövde ange resursgruppen och platsen här med den az postgres up inledande användningen av az webapp up .
  1. Kontrollera att du är i mappen djangoapp-lagringsplats som innehåller appkoden i terminalen.

  2. Växla till exempelappens flexible-server -gren. Den här grenen innehåller den specifika konfiguration som krävs för PostgreSQL – flexibel server:

    git checkout flexible-server
    
  3. Kör följande kommando az webapp up för att skapa App Service för appen:

    az webapp up --name <app-name> --sku B1 
    

    Det här kommandot utför följande åtgärder, vilket kan ta några minuter, med hjälp av resursgrupp och plats som cachelagrats från föregående kommando (gruppen i az group create regionen i det här Python-Django-PGFlex-rg centralus exemplet).

    • Skapa en App Service plan på prisnivån Basic (B1). Du kan utelämna att --sku använda standardvärden.
    • Skapa App Service appen.
    • Aktivera standardloggning för appen.
    • Upload lagringsplatsen med ZIP-distribution med byggautomatisering aktiverat.

Vid lyckad distribution genererar kommandot JSON-utdata som i följande exempel:

Exempel på utdata från az webapp up command

Har du problem? Gå först till felsökningsguiden,annars kan du berätta för oss.

4.2 Konfigurera miljövariabler för att ansluta databasen

När koden nu distribueras till App Service är nästa steg att ansluta appen till Postgres-databasen i Azure.

Appkoden förväntar sig att hitta databasinformation i fyra miljövariabler med DBHOST namnet , , och DBNAME DBUSER DBPASS .

Om du vill ange miljövariabler i App Service skapar du "appinställningar" med följande kommando az webapp config appsettings set.

az webapp config appsettings set --settings DBHOST="<postgres-server-name>" DBUSER="<username>" DBPASS="<password>" DBNAME="pollsdb" 
  • Ersätt <postgres-server-name> med det namn som du använde tidigare med kommandot az postgres up . Koden i azuresite/production.py läggs automatiskt till för att .postgres.database.azure.com skapa den fullständiga Postgres-server-URL:en.
  • Ersätt <username> och med de <password> administratörsautentiseringsuppgifter som du använde med az postgres up det tidigare kommandot, eller de som az postgres up genererades åt dig. Koden i azuresite/production.py skapar automatiskt det fullständiga Postgres-användarnamnet från och , så DBUSER ta inte med DBHOST @server delen. (Som tidigare nämnts bör du inte heller använda tecknet i något av dessa värden eftersom det har en $ särskild betydelse för Linux-miljövariabler.)
  • Resursgruppen och appnamnen hämtas från de cachelagrade värdena i .azure/config-filen.
az webapp config appsettings set --settings DBHOST="<host>" DBUSER="<username>" DBPASS="<password>" DBNAME="flexibleserverdb" 

Ersätt värden, användarnamn och lösenord med värden från utdata från kommandot az postgres flexible-server create som användes tidigare. Värden ska vara en URL som server383813186.postgres.database.azure.com .

Ersätt också flexibleserverdb med databasnamnet om du har ändrat det med az postgres flexible-server create kommandot .

I Din Python-kod kommer du åt de här inställningarna som miljövariabler med instruktioner som os.environ.get('DBHOST') . Mer information finns i Åtkomst till miljövariabler.

Har du problem? Gå först till felsökningsguiden,annars kan du berätta för oss.

4.3 Kör Django-databasmigrering

Django-databasmigreringarna ser till att schemat i PostgreSQL på Azure-databasen matchar de som beskrivs i koden.

  1. Kör az webpp ssh för att öppna en SSH-session för webbappen i webbläsaren:

    az webapp ssh
    

    Om du inte kan ansluta till SSH-sessionen har det inte gått att starta själva appen. Mer information finns i diagnostikloggarna. Om du till exempel inte har skapat de nödvändiga appinställningarna i föregående avsnitt visar loggarna KeyError: 'DBNAME' .

  2. I SSH-sessionen kör du följande kommandon (du kan klistra in kommandon med Ctrl + Skift + V):

    # Run database migrations
    python manage.py migrate
    
    # Create the super user (follow prompts)
    python manage.py createsuperuser
    

    Om du stöter på fel som rör anslutning till databasen kontrollerar du värdena för de programinställningar som skapades i föregående avsnitt.

  3. Kommandot createsuperuser uppmanar dig att ange autentiseringsuppgifter för superanvändare. I den här självstudien använder du standardnamnet , trycker på Retur för e-postadressen för att lämna den tom root och anger som Pollsdb1 lösenord.

  4. Om du ser ett fel om att databasen är låst kontrollerar du att du körde az webapp settings kommandot i föregående avsnitt. Utan dessa inställningar kan inte migreringskommandot kommunicera med databasen, vilket resulterar i felet.

Har du problem? Gå först till felsökningsguiden,annars kan du berätta för oss.

4.4 Skapa en omröstningsfråga i appen

  1. Öppna appens webbplats. Appen bör visa meddelandet "Appen Avsöker" och "Inga omröstningar är tillgängliga" eftersom det inte finns några specifika omröstningar ännu i databasen.

    az webapp browse
    

    Om du ser "Programfel" är det troligt att du antingen inte skapade de obligatoriska inställningarna i föregående steg,Konfigurera miljövariabler för att ansluta databasen eller att dessa värden innehåller fel. Kör kommandot az webapp config appsettings list för att kontrollera inställningarna. Du kan också kontrollera diagnostikloggarna för att se specifika fel när appen startas. Om du till exempel inte har skapat inställningarna visas felet i loggarna, KeyError: 'DBNAME' .

    När du har uppdaterat inställningarna för att åtgärda eventuella fel ger du appen en minut att starta om och uppdaterar sedan webbläsaren.

  2. Bläddra till webbappens administratörssida genom att lägga /admin till i URL:en, till exempel http://<app-name>.azurewebsites.net/admin . Logga in med Django-autentiseringsuppgifter för superanvändare från föregående avsnitt ( root och Pollsdb1 ). Under Omröstningar väljer du Lägg till bredvid Frågor och skapar en omröstningsfråga med några alternativ.

  3. Gå tillbaka till huvudwebbplatsen ( http://<app-name>.azurewebsites.net ) för att bekräfta att frågorna nu visas för användaren. Besvara frågor men du vill generera data i databasen.

Grattis! Du kör en Python Django-webbapp i Azure App Service Linux, med en aktiv Postgres-databas.

Har du problem? Berätta för oss.

Anteckning

App Service identifierar ett Django-projekt genom att söka efter wsgi.py fil i varje undermapp, vilket skapas som manage.py startproject standard. När App Service hittar filen läses Django-webbappen in. Mer information finns i Konfigurera inbyggd Python-avbildning.

5. Gör ändringar i koden och distribuera om

I det här avsnittet gör du lokala ändringar i appen och distribuerar om koden till App Service. I processen ställer du in en virtuell Python-miljö som stöder kontinuerligt arbete.

5.1 Kör appen lokalt

Kör följande kommandon i ett terminalfönster. Se till att följa anvisningarna när du skapar superanvändaren:

# Configure the Python virtual environment
python3 -m venv venv
source venv/bin/activate

# Install dependencies
pip install -r requirements.txt
# Run Django migrations
python manage.py migrate
# Create Django superuser (follow prompts)
python manage.py createsuperuser
# Run the dev server
python manage.py runserver

När webbappen har lästs in fullständigt anger Django-utvecklingsservern den lokala app-URL:en i meddelandet "Startar utvecklingsservern på http://127.0.0.1:8000/ . Avsluta servern med CTRL+BREAK".

Exempel på utdata för Django-utvecklingsserver

Testa appen lokalt med följande steg:

  1. Gå till http://localhost:8000 i en webbläsare, som ska visa meddelandet "Inga omröstningar är tillgängliga".

  2. Gå till http://localhost:8000/admin och logga in med den administratörsanvändare som du skapade tidigare. Under Omröstningar väljer du återigen Lägg till bredvid Frågor och skapar en omröstningsfråga med vissa alternativ.

  3. Gå till http://localhost:8000 igen och besvara frågan för att testa appen.

  4. Stoppa Django-servern genom att trycka + Ctrl C.

När appen körs lokalt använder den en lokal Sqlite3-databas och stör inte produktionsdatabasen. Du kan också använda en lokal PostgreSQL-databas om du vill för att simulera din produktionsmiljö på ett bättre sätt.

Har du problem? Berätta för oss.

5.2 Uppdatera appen

I polls/models.py letar du upp den rad som börjar med och ändrar choice_text max_length parametern till 100:

# Find this line of code and set max_length to 100 instead of 200
choice_text = models.CharField(max_length=100)

Eftersom du ändrade datamodellen skapar du en ny Django-migrering och migrerar databasen:

python manage.py makemigrations
python manage.py migrate

Kör utvecklingsservern igen med python manage.py runserver och testa appen på till http: / /localhost:8000/admin:

Stoppa Django-webbservern igen med Ctrl + C.

Har du problem? Gå först till felsökningsguiden,annars kan du berätta för oss.

5.3 Distribuera om koden till Azure

Kör följande kommando i lagringsplatsens rot:

az webapp up

Det här kommandot använder de parametrar som cachelagras i .azure/config-filen. Eftersom App Service identifierar att appen redan finns distribuerar den bara om koden.

Har du problem? Gå först till felsökningsguiden,annars kan du berätta för oss.

5.4 Kör om migreringar i Azure

Eftersom du har gjort ändringar i datamodellen måste du köra databasmigreringarna på App Service.

Öppna en SSH-session igen i webbläsaren genom att gå till https://<app-name>.scm.azurewebsites.net/webssh/host . Kör följande kommando:

python manage.py migrate

Har du problem? Gå först till felsökningsguiden,annars kan du berätta för oss.

5.5 Granska appen i produktion

Bläddra till appen igen (med eller az webapp browse navigera till ) och testa appen igen i http://<app-name>.azurewebsites.net produktion. (Eftersom du bara ändrade längden på ett databasfält är ändringen bara märkbar om du försöker ange ett längre svar när du skapar en fråga.)

Har du problem? Gå först till felsökningsguiden,annars kan du berätta för oss.

6. Strömma diagnostikloggar

Du kan komma åt konsolloggarna som genereras inifrån containern som är värd för appen i Azure.

Kör följande Azure CLI-kommando för att se loggströmmen. Det här kommandot använder parametrar som cachelagras i .azure/config-filen.

az webapp log tail

Om du inte ser konsolloggarna omedelbart kan du titta efter igen efter 30 sekunder.

Om du vill stoppa loggströmningen när som helst skriver du Ctrl + C.

Har du problem? Berätta för oss.

Anteckning

Du kan även granska loggfilerna från din webbläsare via https://<app-name>.scm.azurewebsites.net/api/logs/docker.

az webapp up aktiverar standardloggningen åt dig. Av prestandaskäl stängs den här loggningen av efter en stund, men återigen varje gång du kör az webapp up igen. Kör följande kommando för att aktivera det manuellt:

az webapp log config --docker-container-logging filesystem

7. Hantera din app i Azure Portal

I Azure Portaldu efter appnamnet och väljer appen i resultatet.

Gå till din Python Django-app i Azure Portal

Som standard visar portalen appens översiktssida, som ger en allmän prestandavy. Här kan du också utföra grundläggande hanteringsuppgifter som att bläddra, stoppa, starta om och ta bort. På flikarna till vänster på sidan kan du se olika konfigurationssidor som du kan öppna.

Hantera din Python Django-app på översiktssidan i Azure Portal

Har du problem? Gå först till felsökningsguiden,annars kan du berätta för oss.

8. Rensa resurser

Om du vill behålla appen eller fortsätta till de ytterligare självstudierna kan du gå vidare till Nästa steg. Annars kan du ta bort resursgruppen som skapades för den här självstudien för att undvika löpande avgifter:

az group delete --name Python-Django-PGFlex-rg --no-wait

Genom att ta bort resursgruppen kan du också allokera och ta bort alla resurser som ingår i den. Se till att du inte längre behöver resurserna i gruppen innan du använder kommandot .

Det kan ta lite tid att ta bort alla resurser. Argumentet --no-wait gör att kommandot kan returnera omedelbart.

Har du problem? Berätta för oss.

Nästa steg

Lär dig hur du mappar ett anpassat DNS-namn till din app:

Lär dig App Service kör en Python-app: