Samouczek: łączenie aplikacji internetowej Django z usługą Azure Database for PostgreSQL przy użyciu narzędzia Service Connector

Z tego samouczka dowiesz się, jak wdrożyć aplikację internetową Python Django opartą na danych do usługi Azure App Service oraz jak użyć Service Connector do połączenia z innymi usługami Azure. Przykładowa aplikacja internetowa przechowuje informacje o restauracjach i recenzjach w bazie danych Azure Database for PostgreSQL oraz przechowuje zdjęcia w kontenerze Azure Storage.

Aby wykonać następujące zadania, należy użyć Azure CLI:

Uwaga / Notatka

Ten samouczek jest podobny do samouczka Deploy a Python Django web app with PostgreSQL in Azure usługi aplikacyjnej, ale korzysta z tożsamości zarządzanej bez hasła przypisanej przez system z kontrolą dostępu opartą na rolach Azure, aby uzyskać dostęp do innych zasobów Azure. W sekcji Tworzenie połączenia z usługą bez hasła w tym artykule pokazano, jak łącznik usługi upraszcza proces nawiązywania połączenia.

Aplikacja internetowa używa klasy DefaultAzureCredential klasy Python Azure Identity client library aby automatycznie wykrywać, kiedy istnieje tożsamość zarządzana i używa jej do uzyskiwania dostępu do innych zasobów.

Wymagania wstępne

  • Subskrypcja Azure z uprawnieniami do zapisu i przypisywania ról dla zasobów samouczka w regionie Azure, który obsługuje Łącznik Usługi i ma wystarczające wsparcie App Service i limitem przydziału.

  • Azure Cloud Shell aby uruchomić kroki samouczka lub jeśli wolisz uruchomić lokalnie:

    1. Install Azure CLI 2.87.0 lub nowszy. Aby sprawdzić wersję, uruchom polecenie az version. Aby uaktualnić, uruchom polecenie az upgrade.
    2. Zainstaluj Python 3.
    3. Zainstalowanie oprogramowania Git.
    4. Zaloguj się do Azure przy użyciu az login i postępując zgodnie z monitami.

Konfigurowanie środowiska

  1. Zarejestruj dostawców zasobów Microsoft.ServiceLinker i Microsoft.DBforPostgreSQL dla swojej subskrypcji.

    az provider register --namespace Microsoft.ServiceLinker
    az provider register --namespace Microsoft.DBforPostgreSQL
    
  2. Zainstaluj najnowszą wersję rozszerzenia Service Connector bez hasła. Parametr --upgrade aktualizuje rozszerzenie, jeśli jest już zainstalowane:

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

Klonowanie przykładowej aplikacji

Important

Repozytorium przykładów tutorialu zostało zarchiwizowane 15 czerwca 2026 roku i nie jest już aktywnie utrzymywane. Używaj go tylko do ukończenia tego tutorialu.

  1. Sklonuj przykładowe repozytorium aplikacji.

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

    Alternatywnie możesz pobrać aplikację z repozytorium serviceconnector-webapp-postgresql-django-passwordless i rozpakować ją do folderu o nazwie serviceconnector-webapp-postgresql-django-passwordless.

  2. Zmień katalogi w folderze repozytorium przy użyciu polecenia cd serviceconnector-webapp-postgresql-django-passwordless i uruchom wszystkie pozostałe polecenia z tego folderu.

W przykładowej aplikacji ustawienia produkcji aplikacji webowej znajdują się w pliku azureproject/production.py . Ustawienia deweloperskie są w Azureproject/settings.py. Ustawienia produkcyjne konfigurują platformę Django do uruchamiania w dowolnym środowisku produkcyjnym i nie są specyficzne dla usługi App Service.

Aplikacja używa ustawień produkcyjnych, gdy zmienna środowiskowa jest ustawiona WEBSITE_HOSTNAME . App Service ustawia tę zmienną na nazwę hosta aplikacji, na przykład .msdocs-django.azurewebsites.net

Aby uzyskać więcej informacji, zobacz listę kontrolną wdrażania Django. Zobacz również ustawienia Production dla platformy Django w Azure.

Definiowanie początkowych zmiennych środowiskowych

Poniższy kod definiuje niezbędne zmienne środowiskowe na potrzeby tego samouczka.

  • LOCATION musi być regionem Azure, w którym subskrypcja ma wystarczający limit, aby utworzyć zasoby, i nie ogranicza usługi Azure Database for PostgreSQL dla tej subskrypcji.
  • Hasło administratora PostgreSQL musi zawierać od 8 do 128 znaków z co najmniej trzech z tych kategorii: wielkie litery, małe litery, cyfry oraz znaki niealfanumeryczne. Nie używaj $ hasła do tego tutoriala.
  1. Ustaw następujące zmienne środowiskowe, zastępując <region> je wartością poprawną:

    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. Odczytaj hasło administratora PostgreSQL bez wyświetlania hasła lub dodawania go do historii powłoki:

    read -s -p "PostgreSQL administrator password: " ADMIN_PW && echo
    
  3. Utwórz grupę zasobów zawierającą wszystkie zasoby projektu. Nazwa grupy zasobów jest buforowana i automatycznie stosowana do kolejnych poleceń.

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

Wdrażanie kodu aplikacji w usłudze App Service

Stwórz hosta aplikacji w App Service, włącz automatyzację budowania i wdroż przykładowy kod aplikacji. Plan usługi App Service Basic (B1) używany w tym samouczku powoduje naliczanie opłat w ramach subskrypcji platformy Azure. Aktualne ceny można znaleźć w artykule Ceny App Service.

  1. Plik requirements.txt zarchiwizowanej próbki nie deklaruje serwera Gunicorn używanego przez start.sh. Dodaj go do swojej lokalnej kopii, jeśli nie jest jeszcze dostępny:

    grep -qiE "^gunicorn([=<>~ ]|$)" requirements.txt || echo "gunicorn" >> requirements.txt
    
  2. Utwórz plan usługi App Service dla systemu Linux w warstwie cenowej Basic (B1), a następnie utwórz aplikację internetową przy użyciu przykładowego polecenia startowego:

    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. Włącz automatyzację budowania App Service, aby wdrożenie instalowało pakiety w requirements.txt:

    az webapp config appsettings set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
    
  4. Z korzenia repozytorium stwórz plik ZIP przykładowej aplikacji i wdroż go, korzystając z 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
    

    Polecenie wdrożenia kończy się sukcesem, gdy App Service zaakceptuje plik ZIP. Budowa trwa dalej w App Service i może zająć kilka minut.

Utwórz bazę danych PostgreSQL na platformie Azure

Stwórz Azure Database for PostgreSQL elastyczny serwer i bazę danych do przechowywania danych aplikacji.

  1. Utwórz serwer 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
    

    Polecenie kończy się powodzeniem, gdy stan aprowizacji elastycznego serwera PostgreSQL wynosi Succeeded.

  2. Usuń hasło administratora z obecnej powłoki po utworzeniu serwera:

    unset ADMIN_PW
    
  3. Utwórz bazę danych za pomocą polecenia 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
    

Tworzenie połączenia usługi bez hasła

Użyj polecenia az webapp connection create postgres-flexible, aby dodać łącznik usługi, który łączy aplikację internetową platformy Azure z bazą danych PostgreSQL przy użyciu uwierzytelniania bezhasłowego za pomocą tożsamości zarządzanej. Następujące polecenie konfiguruje Azure Database for PostgreSQL do używania tożsamości zarządzanej i Azure kontroli dostępu opartej na rolach. Dane wyjściowe polecenia zawierają listę akcji, które wykonuje łącznik usługi.

Polecenie tworzy ustawienie aplikacji o nazwie AZURE_POSTGRESQL_CONNECTIONSTRING zawierające informacje o połączeniu z bazą danych. Próbka odczytuje to ustawienie w azureproject/production.py. Aby uzyskać więcej informacji, zobacz Access environment variables (Uzyskiwanie dostępu do zmiennych środowiskowych).

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

Połączenie jest gotowe, gdy polecenie wyświetli informację o połączeniu z elastycznym serwerem PostgreSQL i utworzy ustawienie aplikacji AZURE_POSTGRESQL_CONNECTIONSTRING.

Połącz aplikację internetową Django z usługą Azure Storage za pomocą Service Connector

Utwórz konto Azure storage, a następnie użyj połączenia z aplikacją webową AZ i utworz storage-blob, aby połączyć je z aplikacją webową. Polecenie połączenia wykonuje następujące działania:

  • Włącza tożsamość zarządzaną przypisaną przez system w aplikacji internetowej.
  • Dodaje aplikację webową z rolą Storage Blob Data Contributor do konta magazynowego.
  • Konfiguruje sieć konta magazynowania tak, aby akceptowała dostęp z aplikacji webowej.
  • Tworzy zmienną środowiskową o nazwie AZURE_STORAGEBLOB_RESOURCEENDPOINT dla konta Azure Storage.

Tworzenie konta Azure Storage

Utwórz konto magazynu ogólnego przeznaczenia w wersji 2 z magazynem lokalnie nadmiarowym:

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

Stwórz połączenie pamięci bez hasła

Stwórz połączenie bezhasłowe do konta magazynowego:

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

Połączenie jest gotowe, gdy komenda zgłasza połączenie z kontem pamięci i tworzy AZURE_STORAGEBLOB_RESOURCEENDPOINT ustawienia aplikacji.

Konfiguruj przykładowy pojemnik zdjęć

  1. Zaktualizuj konto Azure Storage, aby umożliwić publiczny dostęp do blobów dla tej zarchiwizowanej przykładowej aplikacji.

    Uwaga / Notatka

    Ten zarchiwizowany przykład wykorzystuje bezpośrednie adresy URL do wyświetlania zdjęć, dzięki czemu samouczek umożliwia anonimowy dostęp do odczytu kontenera photos . To ustawienie jest specyficzne dla próbki i nie jest wymagane przez Service Connector. W przypadku aplikacji produkcyjnych zachowaj prywatność kontenerów i stosuj kontrolowaną metodę dostarczania, taką jak uwierzytelniony punkt końcowy aplikacji.

    az storage account update \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --allow-blob-public-access true
    
  2. Przypisz użytkownikowi uprawnienia do utworzenia kontenera, korzystając z uwierzytelniania Microsoft Entra:

    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
    

    Ustawienie parametru MSYS_NO_PATHCONV dla tego polecenia zapobiega konwertowaniu przez Git Bash w systemie Windows identyfikatora zasobu platformy Azure na ścieżkę systemu Windows. Nie ma to wpływu w Azure Cloud Shell ani innych środowiskach Bash. Przypisania ról mogą zacząć obowiązywać po kilku minutach.

  3. Użyj az storage container create do stworzenia kontenera o nazwie photos i umożliwienia anonimowego dostępu do odczytu blobów w tym kontenerze:

    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
    

    Kontener jest gotowy, gdy odpowiedź wyświetla "created": true dla kontenera photos.

Testowanie aplikacji internetowej Python w Azure

Otwórz i przetestuj aplikację internetową Azure Restaurant Review. Aplikacja używa pakietu azure.identity i jej DefaultAzureCredential klasy. Gdy aplikacja jest uruchomiona w Azure, DefaultAzureCredential automatycznie wykrywa, kiedy istnieje tożsamość zarządzana dla usługi App Service i używa jej do uzyskiwania dostępu do zasobów Azure Storage i Azure Database for PostgreSQL. Aplikacja nie musi dostarczać kluczy magazynu, certyfikatów ani poświadczeń w celu uzyskania dostępu do tych zasobów.

  • W przypadku instalacji lokalnej Azure CLI możesz użyć az webapp browse, aby otworzyć aplikację w przeglądarce domyślnej:

    az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell nie może otworzyć przeglądarki lokalnej, więc nie obsługuje polecenia az webapp browse. W Cloud Shell wybierz link Default domain w prawym górnym rogu strony aplikacji w witrynie Azure Portal.

Uruchomienie aplikacji może potrwać minutę lub dwie. Jeśli zostanie wyświetlona domyślna strona aplikacji, która nie jest przykładową aplikacją, zaczekaj minutę i odśwież przeglądarkę.

Przetestuj funkcjonalność przykładowej aplikacji, dodając restaurację i kilka recenzji ze zdjęciami. Aplikacja powinna przypominać następujący zrzut ekranu:

Zrzut ekranu przykładowej aplikacji internetowej z recenzjami restauracji, pokazując wpis o restauracji z opinią klienta i przesłanym zdjęciem.

Uprzątnij zasoby

Aby uniknąć bieżących opłat, możesz usunąć zasoby utworzone na potrzeby tego samouczka, usuwając grupę zasobów, która je zawiera. Przed uruchomieniem polecenia upewnij się, że nie potrzebujesz już aplikacji ani zasobów.

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

Polecenie wraca natychmiast, podczas gdy Azure usuwa zasoby.

Troubleshooting

Jeśli aplikacja nie uruchamia się ani nie łączy ze swoimi zasobami, sprawdź dzienniki wdrożenia usługi App Service, potwierdź, że ustawienia aplikacji AZURE_POSTGRESQL_CONNECTIONSTRING i AZURE_STORAGEBLOB_RESOURCEENDPOINT istnieją, i odczekaj kilka minut, aż przypisania ról platformy Azure zaczną obowiązywać. W przypadku problemów z uruchamianiem aplikacji Python zobacz następujący artykuł: