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ö
- Ha ett Azure-konto med en aktiv prenumeration. Skapa ett konto utan kostnad.
- Installera Python 3.6 eller senare.
- 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_HOSTNAMEmiljövariabeln anges. Azure App Service anger automatiskt den här variabeln till webbappens URL, till exempelmsdocs-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-nameatt 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-rgnamnet , om den inte redan finns. - Skapa en Postgres-server med namnet av
--server-nameargumentet . - Skapa ett administratörskonto med
--admin-userargumenten--admin-passwordoch . Du kan utelämna de här argumenten så att kommandot kan generera unika autentiseringsuppgifter åt dig. - Skapa en
pollsdbdatabas 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
pollsdbdatabasen.
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.
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 onSkapa 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 centralusSkapa databasservern (processen tar några minuter):
az postgres flexible-server create --sku-name Standard_B1ms --public-access allOm kommandot inte känns igen måste du ha Azure CLI installerat enligt
azbeskrivningen 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--nameparametern . Namnet måste vara unikt i hela Azure. - Kommandot använder prisnivån med
Standard_B1mslägst kostnad. Utelämna argumentet--sku-nameför att användaStandard_D2s_v3standardnivån. - Kommandot använder resursgruppen och platsen som cachelagrades från föregående kommando, vilket
az group createi det här exemplet ärPython-Django-PGFlex-rgresursgruppen icentralusregionen.
- Som standard använder kommandot ett genererat namn som
- Skapa ett administratörskonto med ett användarnamn och lösenord. Du kan ange dessa värden direkt med
--admin-user--admin-passwordparametrarna och . - Skapa en databas med namnet
flexibleserverdbsom standard. Du kan ange ett databasnamn med--database-nameparametern . - Ger fullständig offentlig åtkomst, som du kan styra med hjälp av
--public-accessparametern .
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
--locationargumentet 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örA-Zär ,0-9och-. 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.
--planoch--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 upigen 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 denaz postgres upinledande användningen avaz webapp up.
Kontrollera att du är i mappen djangoapp-lagringsplats som innehåller appkoden i terminalen.
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-serverKör följande kommando
az webapp upför att skapa App Service för appen:az webapp up --name <app-name> --sku B1Det 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 createregionen i det härPython-Django-PGFlex-rgcentralusexemplet).- Skapa en App Service plan på prisnivån Basic (B1). Du kan utelämna att
--skuanvända standardvärden. - Skapa App Service appen.
- Aktivera standardloggning för appen.
- Upload lagringsplatsen med ZIP-distribution med byggautomatisering aktiverat.
- Skapa en App Service plan på prisnivån Basic (B1). Du kan utelämna att
Vid lyckad distribution genererar kommandot JSON-utdata som i följande exempel:

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.comskapa den fullständiga Postgres-server-URL:en. - Ersätt <username> och med de <password> administratörsautentiseringsuppgifter som du använde med
az postgres updet tidigare kommandot, eller de somaz postgres upgenererades åt dig. Koden i azuresite/production.py skapar automatiskt det fullständiga Postgres-användarnamnet från och , såDBUSERta inte medDBHOST@serverdelen. (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.
Kör
az webpp sshför att öppna en SSH-session för webbappen i webbläsaren:az webapp sshOm 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'.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 createsuperuserOm 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.
Kommandot
createsuperuseruppmanar 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 tomrootoch anger somPollsdb1lösenord.Om du ser ett fel om att databasen är låst kontrollerar du att du körde
az webapp settingskommandot 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
Ö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 browseOm 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 listfö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.
Bläddra till webbappens administratörssida genom att lägga
/admintill i URL:en, till exempelhttp://<app-name>.azurewebsites.net/admin. Logga in med Django-autentiseringsuppgifter för superanvändare från föregående avsnitt (rootochPollsdb1). Under Omröstningar väljer du Lägg till bredvid Frågor och skapar en omröstningsfråga med några alternativ.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".

Testa appen lokalt med följande steg:
Gå till
http://localhost:8000i en webbläsare, som ska visa meddelandet "Inga omröstningar är tillgängliga".Gå till
http://localhost:8000/adminoch 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.Gå till
http://localhost:8000igen och besvara frågan för att testa appen.Stoppa Django-servern genom att trycka på + 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.

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.

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: