Öğretici: Service Connector kullanarak bir Django web uygulamasını PostgreSQL için Azure Veri Tabanı'e bağlama

Bu öğreticide, Azure App Service için veri temelli bir Python Django web uygulaması dağıtmayı ve bunu diğer Azure hizmetlerine bağlamak için Hizmet Bağlayıcısı'nı kullanmayı öğreneceksiniz. Örnek web uygulaması, restoran ve inceleme bilgilerini bir PostgreSQL için Azure Veri Tabanı veritabanında, fotoğrafları ise bir Azure Depolama kapsayıcısında depolar.

Aşağıdaki görevleri tamamlamak için Azure CLI kullanırsınız:

Not

Bu öğretici, App Service Deploy a Python Django web app with PostgreSQL in Azure öğreticisine benzer, ancak diğer Azure kaynaklarına erişmek için Azure rol tabanlı erişim denetimine sahip sistem tarafından atanan parolasız yönetilen kimliği kullanır. Bu makalenin Parolasız hizmet bağlantısı oluşturma bölümünde, Service Connector'ın bağlantı işlemini nasıl kolaylaştıracağı gösterilir.

Web uygulaması Python Azure Identity istemci>< kitaplığının DefaultAzureCredential sınıfını kullanarak yönetilen kimliğin ne zaman var olduğunu otomatik olarak algılar ve diğer kaynaklara erişmek için kullanır.

Önkoşullar

  • Service Connector'ı destekleyen ve yeterli App Service desteği ve kotasına sahip bir Azure bölgesinde, öğretici kaynakları için yazma ve rol atama izinlerine sahip bir Azure aboneliği.

  • Öğretici adımlarını çalıştırmak için Azure Cloud Shell veya yerel olarak çalıştırmayı tercih ediyorsanız:

    1. Azure CLI 2.87.0 veya daha sonrasını kurun. Sürümünüzü denetlemek için komutunu çalıştırın az version. Yükseltmek için komutunu çalıştırın az upgrade.
    2. Python 3'ü yükleyin.
    3. Git'i yükleyin.
    4. az login kullanarak ve istemleri izleyerek Azure oturum açın.

Ortamınızı ayarlama

  1. Aboneliğiniz için Microsoft.ServiceLinker ve Microsoft.DBforPostgreSQL kaynak sağlayıcılarını kaydedin.

    az provider register --namespace Microsoft.ServiceLinker
    az provider register --namespace Microsoft.DBforPostgreSQL
    
  2. Service Connector şifresiz uzantısının en son sürümünü yükleyin. Parametre --upgrade , zaten yüklüyse uzantını günceller:

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

Örnek uygulamayı kopyalama

Important

Eğitimin örnek deposu 15 Haziran 2026'da arşivlendi ve artık aktif olarak tutulmamaktadır. Sadece bu eğitimi tamamlamak için kullanın.

  1. Örnek uygulama deposunu kopyalayın.

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

    Alternatif olarak, uygulamayı serviceconnector-webapp-postgresql-django-passwordless deposundan indirebilir ve serviceconnector-webapp-postgresql-django-passwordless adlı bir klasöre indirebilirsiniz.

  2. Dizini cd serviceconnector-webapp-postgresql-django-passwordless ile depo dizinine değiştirin ve bu dizinden kalan tüm komutları çalıştırın.

Örnek uygulamada, web uygulaması üretim ayarları azureproject/production.py dosyasındadır. Geliştirme ayarları azureproject/settings.py'da. Üretim ayarları, Django'yu herhangi bir üretim ortamında çalışacak şekilde yapılandırabilir ve App Service'e özgü değildir.

Ortam değişkeni ayarlandığında uygulama üretim ayarlarını WEBSITE_HOSTNAME kullanır. App Service bu değişkeni uygulamanın ana ismine ayarlıyor, örneğin msdocs-django.azurewebsites.net.

Daha fazla bilgi için bkz. Django dağıtım denetim listesi. Ayrıca bkz. Azure üzerinde Django için Üretim ayarları.

İlk ortam değişkenlerini tanımlama

Aşağıdaki kod, bu öğretici için gerekli ortam değişkenlerini tanımlar.

  • LOCATION, aboneliğinizin kaynakları oluşturmak için yeterli kotaya sahip olduğu ve PostgreSQL için Azure Veri Tabanı için herhangi bir kısıtlama olmadığı bir Azure bölgesi olmalıdır.
  • PostgreSQL yönetici şifresi, bu kategorilerden en az üçünden 8 ila 128 karakter içermelidir: büyük harfler, küçük harfler, rakamlar ve alfanumerik olmayan karakterler. Bu eğitimde şifrede $ kullanmayın.
  1. Aşağıdaki ortam değişkenlerini ayarlayın, yerine geçerli bir değer verin <region> :

    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. PostgreSQL yöneticisi şifresini göstermeden veya shell geçmişinize eklemeden okuyun:

    read -s -p "PostgreSQL administrator password: " ADMIN_PW && echo
    
  3. Tüm proje kaynaklarını içerecek bir kaynak grubu oluşturun. Kaynak grubu adı önbelleğe alınır ve sonraki komutlara otomatik olarak uygulanır.

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

Uygulama kodunu App Service'e dağıtma

App Service'te uygulama barındırıcısını oluşturun, derleme otomasyonunu etkinleştirin ve örnek uygulama kodunu dağıtın. Bu eğitimde kullanılan Basic (B1) App Service planı, Azure aboneliğinizde bir maliyet taşır. Güncel fiyatlar için bkz. App Service fiyatlandırması.

  1. Arşivlenen örneklemin requirements.txt dosyası, start.sh tarafından kullanılan Gunicorn sunucusunu belirtmez. Eğer mevcut değilse, yerel kopyanıza ekleyin:

    grep -qiE "^gunicorn([=<>~ ]|$)" requirements.txt || echo "gunicorn" >> requirements.txt
    
  2. Basic (B1) fiyatlandırma katmanında bir Linux App Service planı oluşturun ve ardından örnekin başlangıç komutuyla web uygulamasını oluşturun:

    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. Dağıtımın requirements.txt içindeki paketleri yüklemesi için App Service derleme otomasyonunu etkinleştirin:

    az webapp config appsettings set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
    
  4. Depo kökünden, örnek uygulamanın bir ZIP dosyasını oluşturun ve az webapp deploy kullanarak dağıtın:

    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
    

    Dağıtım komutu App Service ZIP dosyasını kabul ettiğinde başarılı olur. Yapı App Service'te devam ediyor ve birkaç dakika sürebilir.

Azure'da PostgreSQL veritabanı oluştur

PostgreSQL için Azure Veri Tabanı esnek sunucu ve uygulama verilerini depolamak için veritabanı oluşturun.

  1. PostgreSQL için Azure Veri Tabanı sunucusunu oluşturun:

    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
    

    PostgreSQL esnek sunucu sağlama durumu Succeeded olduğunda komut başarılı olur.

  2. Sunucu oluşturulduktan sonra mevcut shell'den yönetici şifresini kaldırın:

    unset ADMIN_PW
    
  3. Az postgres flexible-server db kullanarak veritabanını oluştur:

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

Parolasız hizmet bağlantısı oluşturma

Azure web uygulamasını PostgreSQL veritabanına parolasız yönetilen kimlik doğrulaması kullanarak bağlayan bir hizmet bağlayıcısı eklemek için az webapp connection create postgres-flexible komutunu kullanın. Aşağıdaki komut, PostgreSQL için Azure Veri Tabanı'yi yönetilen kimlik ve Azure rol tabanlı erişim kontrolünü kullanacak şekilde yapılandırır. Komut çıktısı, Service Connector'ın gerçekleştirdiği eylemleri listeler.

Komut, veritabanı bağlantı bilgilerini içeren bir uygulama ayarı oluşturur AZURE_POSTGRESQL_CONNECTIONSTRING . Örnek bu ayarı azureproject/production.py dosyasında okuyor. Daha fazla bilgi için bkz. Ortam değişkenlerine erişme.

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

Bağlantı komut PostgreSQL esnek sunucu bağlantısını raporlayıp uygulama ayarını oluşturduğunda AZURE_POSTGRESQL_CONNECTIONSTRING hazır olur.

Django web uygulamasını Service Connector ile Azure Depolama'a bağlama

Bir Azure depolama hesabı oluşturun ve ardından az webapp bağlantısı ile web uygulamasına bağlanmak için storage blob oluşturun. Bağlantı komutu aşağıdaki işlemleri yapar:

  • Web uygulamasında sistem tarafından atanan yönetilen kimliği etkinleştirir.
  • Depolama hesabına Storage Blob Data Contributor rolüne sahip web uygulamasını ekliyor.
  • Depolama hesabı ağını web uygulamasından erişimi kabul etmek üzere yapılandırılır.
  • Azure Depolama hesabı için AZURE_STORAGEBLOB_RESOURCEENDPOINT adlı bir ortam değişkeni oluşturur.

Azure Depolama hesabı oluşturma

Yerel olarak yedekli depolama ile genel amaçlı bir v2 depolama hesabı oluşturun:

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

Şifresiz bir depolama bağlantısı oluşturun

Depolama hesabına şifresiz bağlantı oluşturun:

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

Komut depolama hesabı bağlantısını bildirdiğinde ve AZURE_STORAGEBLOB_RESOURCEENDPOINT uygulama ayarını oluşturduğunda bağlantı hazırdır.

Örnek fotoğraf konteynerini yapılandırın

  1. Bu arşivlenmiş örnek uygulama için bloblara genel okuma erişimi sağlamak üzere Azure Depolama hesabını güncelledin.

    Not

    Bu arşivlenmiş örnek, fotoğrafları görüntülemek için doğrudan blob URL'leri kullanır; bu nedenle öğretici, photos kapsayıcısı için anonim okuma erişimini etkinleştirir. Bu ayar örnekle özgüdür ve Service Connector tarafından zorunlu değildir. Üretim uygulamaları için konteynerleri gizli tutun ve kontrollü bir teslimat yöntemi kullanın; örneğin kimlik doğrulamalı uygulama uç noktası.

    az storage account update \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --allow-blob-public-access true
    
  2. Oturum açılmış kullanıcı izninizi Microsoft Entra kimlik doğrulaması kullanarak konteyneri oluşturmak için atayin:

    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
    

    Bu komut için ayar, MSYS_NO_PATHCONV Windows'ta Git Bash'in Azure kaynak kimliğini Windows yoluna dönüştürmesini engeller. Azure Cloud Shell veya diğer Bash ortamlarında hiçbir etkisi yoktur. Rol atamalarının etkili hale gelmesi birkaç dakika sürebilir.

  3. az storage container create komutunu kullanarak photos adlı bir kapsayıcı oluşturun ve bu kapsayıcıdaki bloblara anonim okuma erişimine izin verin:

    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
    

    Yanıt, photos konteyneri için "created": true gösterdiğinde konteyner hazırdır.

Azure'da Python web uygulamasını test edin

Azure Restaurant Review web uygulamasını açın ve test edin. Uygulama azure.identity paketini ve sınıfını DefaultAzureCredential kullanır. Uygulama Azure çalışırken, DefaultAzureCredential App Service için yönetilen bir kimliğin ne zaman mevcut olduğunu otomatik olarak algılar ve Azure Depolama ve PostgreSQL için Azure Veri Tabanı kaynaklarına erişmek için bunu kullanır. Uygulamanın bu kaynaklara erişmek için depolama anahtarları, sertifikalar veya kimlik bilgileri sağlaması gerekmez.

  • Yerel Azure CLI yüklemesi için, uygulamayı varsayılan tarayıcınızda açmak için az webapp browse kullanabilirsiniz:

    az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell yerel tarayıcıyı açamaz, bu nedenle az webapp browse komutunu desteklemez. Cloud Shell'ten, uygulamanın Azure portal sayfasının sağ üst köşesindeki Varsayılan alan alanı bağlantısını seçin.

Uygulamanın başlatılması bir veya iki dakika sürebilir. Örnek uygulama olmayan bir varsayılan uygulama sayfası görürseniz, bir dakika bekleyin ve tarayıcıyı yenileyin.

Bir restoran ve fotoğraflarla bazı incelemeler ekleyerek örnek uygulamanın işlevselliğini test edin. Uygulama aşağıdaki ekran görüntüsüne benzemelidir:

Örnek restoran incelemesi web uygulamasının ekran görüntüsü, bir restoran girişi, müşteri yorumu ve yüklenmiş bir fotoğraf.

Kaynakları temizleme

Devam eden ücretlendirmelerden kaçınmak için, bu öğretici için oluşturduğunuz kaynakları, bunları içeren kaynak grubunu silerek silebilirsiniz. Komutu çalıştırmadan önce artık uygulamaya veya kaynaklara ihtiyacınız olmadığından emin olun.

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

Komut hemen dönerken, Azure kaynakları siler.

Sorun giderme

Uygulama başlamazsa veya kaynaklarına bağlanmazsa App Service dağıtım günlüklerini denetleyin, AZURE_STORAGEBLOB_RESOURCEENDPOINT ve AZURE_POSTGRESQL_CONNECTIONSTRING uygulama ayarlarının mevcut olduğunu doğrulayın ve Azure rol atamalarının etkili olması için birkaç dakika bekleyin. Python uygulaması başlatma sorunları için aşağıdaki makaleye bakınız: