Tutorial: Koppla en Django-webbapp till Azure Database for PostgreSQL med hjälp av Service Connector

I den här självstudien får du lära dig hur du distribuerar en datadriven webbapp i Python Django till Azure App Service och använder Service Connector för att ansluta den till andra Azure-tjänster. Exempelwebbappen lagrar restaurang- och recensioninformation i en Azure Database for PostgreSQL och lagrar foton i en Azure Storage-container.

Du använder Azure CLI för att utföra följande uppgifter:

Kommentar

Den här självstudien liknar App Service Distribuera en Python Django-webbapp med PostgreSQL i Azure, men använder en systemtilldelad lösenordslös hanterad identitet med rollbaserad åtkomstkontroll i Azure för att få åtkomst till andra Azure-resurser. Avsnittet Skapa en lösenordslös tjänstanslutning i den här artikeln visar hur Service Connector förenklar anslutningsprocessen.

Webbappen använder klassen DefaultAzureCredential för klientbiblioteket Python Azure Identity för att automatiskt identifiera när en hanterad identitet finns och använder den för att komma åt de andra resurserna.

Förutsättningar

  • En Azure-prenumeration med skriv- och rolltilldelningsbehörigheter för självstudieresurserna i en Azure region som supports Service Connector och har tillräckligt App Service-stöd och kvot.

  • Azure Cloud Shell för att genomföra handledningsstegen eller om du föredrar att köra lokalt:

    1. Installera Azure CLI 2.87.0 eller senare. Kontrollera din version genom att köra az version. Om du vill uppgradera kör du az upgrade.
    2. Installera Python 3.
    3. Installera Git.
    4. Logga in på Azure med hjälp av az login och följ anvisningarna.

Konfigurera din miljö

  1. Registrera resursleverantörerna Microsoft.ServiceLinker och Microsoft.DBforPostgreSQL för din prenumeration.

    az provider register --namespace Microsoft.ServiceLinker
    az provider register --namespace Microsoft.DBforPostgreSQL
    
  2. Installera den senaste versionen av Service Connector-tillägget utan lösenord. Parametern --upgrade uppdaterar tillägget om det redan är installerat:

    az extension add --name serviceconnector-passwordless --upgrade
    

Klona exempelappen

Important

Handledningens exempelarkiv arkiverades den 15 juni 2026 och underhålls inte längre aktivt. Använd den bara för att slutföra denna handledning.

  1. Klona exempelapplagringsplatsen.

    git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git
    

    Alternativt kan du ladda ner appen från serviceconnector-webapp-postgresql-django-passwordless arkivet och packa upp den i en mapp som heter serviceconnector-webapp-postgresql-django-passwordless.

  2. Ändra kataloger till lagringsplatsmappen med hjälp av cd serviceconnector-webapp-postgresql-django-passwordless och kör alla återstående kommandon från mappen.

I exempelappen finns produktionsinställningarna för webbappen i filen azureproject/production.py . Utvecklingsinställningarna är i Azureproject/settings.py. Produktionsinställningarna konfigurerar Django att köras i alla produktionsmiljöer och är inte specifika för App Service.

Appen använder produktionsinställningar när WEBSITE_HOSTNAME miljövariabeln anges. App Service sätter denna variabel till appens värdnamn, såsom msdocs-django.azurewebsites.net.

Mer information finns i checklistan för Django-distribution. Se även inställningar för Production för Django på Azure.

Definiera inledande miljövariabler

Följande kod definierar nödvändiga miljövariabler för den här handledningen.

  • LOCATION måste vara en Azure region där din prenumeration har tillräcklig kvot för att skapa resurserna och inte begränsar Azure Database for PostgreSQL för din prenumeration.
  • PostgreSQL-administratörens lösenord måste innehålla 8 till 128 tecken från minst tre av dessa kategorier: versaler, gemener, siffror och icke-alfanumeriska tecken. Använd inte $ lösenordet för denna handledning.
  1. Sätt upp följande miljövariabler och ersätt <region> med ett giltigt värde:

    LOCATION="<region>"
    RAND_ID=$RANDOM$RANDOM
    RESOURCE_GROUP_NAME="msdocs-mi-web-app-$RAND_ID"
    APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID"
    APP_SERVICE_PLAN_NAME="$APP_SERVICE_NAME-plan"
    DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID"
    DATABASE_NAME="restaurant"
    STORAGE_ACCOUNT_NAME="account$RAND_ID"
    ADMIN_USER="demoadmin"
    
  2. Läs PostgreSQL-administratörslösenordet utan att visa det eller lägga till det i din shellhistorik:

    read -s -p "PostgreSQL administrator password: " ADMIN_PW && echo
    
  3. Skapa en resursgrupp som ska innehålla alla projektresurser. Resursgruppens namn cachelagras och tillämpas automatiskt på efterföljande kommandon.

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    

Distribuera appkoden till App Service

Skapa appvärden i App Service, aktivera automatiserade byggen och distribuera exempelkoden för appen. Basic (B1) App Service-planen som används i denna handledning medför en kostnad i din Azure-prenumeration. För aktuella priser, se App Service-priser.

  1. Den arkiverade provets requirements.txt-fil deklarerar inte Gunicorn-servern som används av start.sh. Lägg till den i din lokala kopia om den inte redan finns:

    grep -qiE "^gunicorn([=<>~ ]|$)" requirements.txt || echo "gunicorn" >> requirements.txt
    
  2. Skapa en Linux App Service-plan i Basic (B1)-prisklassen, och skapa sedan webbappen med provets startkommando:

    az appservice plan create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_PLAN_NAME \
      --location $LOCATION \
      --sku B1 \
      --is-linux
    
    az webapp create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --plan $APP_SERVICE_PLAN_NAME \
      --runtime "PYTHON:3.14" \
      --startup-file "start.sh"
    
  3. Aktivera App Service-byggautomation så att distributionen installerar paketen i requirements.txt:

    az webapp config appsettings set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
    
  4. Från repositoroten skapar du en ZIP-fil av exempelappen och distribuerar den genom att använda az webapp deploy:

    rm -f app.zip
    python -m zipfile -c app.zip *
    
    az webapp deploy \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --src-path app.zip \
      --type zip \
      --track-status false
    
    rm app.zip
    

    Utplaceringskommandot lyckas när App Service accepterar ZIP-filen. Bygget fortsätter i App Service och kan ta flera minuter.

Skapa PostgreSQL-databasen i Azure

Skapa en flexibel server och databas i Azure Database for PostgreSQL för att lagra appdata.

  1. Skapa servern för Azure Database for PostgreSQL:

    az postgres flexible-server create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $DB_SERVER_NAME \
      --location $LOCATION \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --sku-name Standard_D2ds_v4 \
      --microsoft-entra-auth Enabled
    

    Kommandot lyckas när PostgreSQL:s flexibla serverprovisioneringstillstånd är Succeeded.

  2. Ta bort administratörslösenordet från det aktuella kommandoskalet efter att servern har skapats:

    unset ADMIN_PW
    
  3. Skapa databasen genom att använda az postgres flexible-server db create:

    az postgres flexible-server db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server-name $DB_SERVER_NAME \
      --name $DATABASE_NAME
    

Skapa en lösenordslös tjänstanslutning

Använd az webapp connection create postgres-flexible för att lägga till en service connector som kopplar Azure-webbappen till PostgreSQL-databasen med lösenordslös hanterad identitetsautentisering. Följande kommando konfigurerar Azure Database for PostgreSQL att använda hanterad identitet och Azure rollbaserad åtkomstkontroll. Kommandoutdata visar de åtgärder som Service Connector vidtar.

Kommandot skapar en appinställning som AZURE_POSTGRESQL_CONNECTIONSTRING heter och innehåller databasens anslutningsinformation. Exemplet visar denna inställning i azureproject/production.py. Mer information finns i Åtkomstmiljövariabler.

az webapp connection create postgres-flexible \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --target-resource-group $RESOURCE_GROUP_NAME \
  --server $DB_SERVER_NAME \
  --database $DATABASE_NAME \
  --client-type python \
  --system-identity \
  --yes

Anslutningen är redo när kommandot rapporterar PostgreSQL:s flexibla serveranslutning och skapar AZURE_POSTGRESQL_CONNECTIONSTRING appinställningen.

Koppla Django-webbappen till Azure Storage med Service Connector

Skapa ett Azure-lagringskonto och använd sedan az webapp connection create storage-blob för att ansluta det till webbappen. Anslutningskommandot utför följande åtgärder:

  • Aktiverar systemtilldelad hanterad identitet i webbappen.
  • Lägger till webbappen med rollen Storage Blob Data Contributor till lagringskontot.
  • Konfigurerar lagringskontots nätverk för att acceptera åtkomst från webbappen.
  • Skapar en miljövariabel med namnet AZURE_STORAGEBLOB_RESOURCEENDPOINT för Azure Storage-kontot.

Skapa ett Azure Storage-konto

Skapa ett allmänt v2-lagringskonto med lokalt redundant lagring:

az storage account create \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $STORAGE_ACCOUNT_NAME \
  --location $LOCATION \
  --sku Standard_LRS \
  --kind StorageV2

Skapa en lösenordslös lagringsanslutning

Skapa den lösenordslösa anslutningen till lagringskontot:

az webapp connection create storage-blob \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --target-resource-group $RESOURCE_GROUP_NAME \
  --account $STORAGE_ACCOUNT_NAME \
  --client-type python \
  --system-identity

Anslutningen är redo när kommandot rapporterar lagringskontots anslutning och skapar AZURE_STORAGEBLOB_RESOURCEENDPOINT appinställningen.

Konfigurera behållaren för exempelfoto

  1. Uppdatera Azure Storage-kontot för att tillåta offentlig läsåtkomst till blobs för denna arkiverade exempelapp.

    Kommentar

    Detta arkiverade prov använder direkta blob-URL:er för att visa foton, så handledningen möjliggör anonym läsåtkomst till containern photos . Denna inställning är specifik för provet och krävs inte av Service Connector. För produktionsappar, håll containrar privata och använd en kontrollerad leveransmetod, såsom en autentiserad applikationsendpoint.

    az storage account update \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --allow-blob-public-access true
    
  2. Tilldela din inloggade användarbehörighet att skapa containern med Microsoft Entra-autentisering:

    SIGNED_IN_USER_ID=$(az ad signed-in-user show --query id --output tsv)
    STORAGE_ACCOUNT_ID=$(az storage account show \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --query id \
      --output tsv)
    
    MSYS_NO_PATHCONV=1 az role assignment create \
      --assignee-object-id $SIGNED_IN_USER_ID \
      --assignee-principal-type User \
      --role "Storage Blob Data Contributor" \
      --scope $STORAGE_ACCOUNT_ID
    

    Inställningen MSYS_NO_PATHCONV för detta kommando förhindrar att Git Bash på Windows konverterar Azure-resurs-ID:t till en Windows-sökväg. Den har ingen effekt i Azure Cloud Shell eller andra Bash-miljöer. Rollutdelningar kan ta några minuter innan de blir effektiva.

  3. Använd az storage container create för att skapa en container som anropas photos och tillåt anonym läsåtkomst till blobs i den containern:

    BLOB_ENDPOINT=$(az storage account show \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --query primaryEndpoints.blob \
      --output tsv)
    
    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login \
      --blob-endpoint $BLOB_ENDPOINT
    

    Behållaren är redo när svaret visas "created": true för containern photos .

Testa Python-webbappen i Azure

Öppna och testa webbappen Azure Restaurant Review. Appen använder azure.identity-paketet och dess DefaultAzureCredential klass. När appen körs i Azure identifierar DefaultAzureCredential automatiskt när en hanterad identitet finns för App Service och använder den för att komma åt Azure Storage och Azure Database for PostgreSQL resurser. Appen behöver inte ange lagringsnycklar, certifikat eller autentiseringsuppgifter för att få åtkomst till dessa resurser.

  • För en lokal Azure CLI installation kan du använda az webapp browse för att öppna appen i standardwebbläsaren:

    az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell kan inte öppna en lokal webbläsare, så den stöder inte kommandot az webapp browse. Från Cloud Shell, välj länken Standarddomän i det övre högra hörnet på appens Azure-portalsida.

Det kan ta en minut eller två innan appen startas. Om du ser en standardappsida som inte är exempelappen väntar du en minut och uppdaterar webbläsaren.

Testa funktionerna i exempelappen genom att lägga till en restaurang och några recensioner med foton. Appen bör likna följande skärmbild:

Skärmdump av den exempelvisa restaurangrecensionsappen som visar en restaurangpost med en kundrecension och ett uppladdat foto.

Rensa resurser

För att undvika löpande avgifter kan du ta bort de resurser som du skapade för den här självstudien genom att ta bort den resursgrupp som innehåller dem. Se till att du inte längre behöver appen eller resurserna innan du kör kommandot.

az group delete --name $RESOURCE_GROUP_NAME --no-wait

Kommandot returneras omedelbart medan Azure raderar resurserna.

Felsökning

Om appen inte startar eller ansluter till sina resurser kontrollerar du distributionsloggarna för App Service, kontrollerar att appinställningarna AZURE_STORAGEBLOB_RESOURCEENDPOINT och AZURE_POSTGRESQL_CONNECTIONSTRING finns och väntar några minuter så att Azure-rolltilldelningar hinner träda i kraft. För problem med Python-appstart, se följande artikel: