Учебник: Подключите веб-приложение Django к База данных Azure для PostgreSQL с помощью Service Connector

В этом руководстве вы узнаете, как развернуть веб-приложение на основе данных Python Django для Служба приложений Azure и использовать соединитель служб для подключения к другим службам Azure. Пример веб-приложения хранит ресторан и просматривает сведения в базе данных База данных Azure для PostgreSQL и сохраняет фотографии в контейнере служба хранилища Azure.

Для выполнения следующих задач используется Azure CLI.

Примечание.

Это руководство аналогично учебнику по службе приложений Deploy веб-приложение Python Django с PostgreSQL в Azure, но использует системное управляемое удостоверение без пароля с управлением доступом на основе ролей Azure для доступа к другим ресурсам Azure. В разделе "Создание подключения службы без пароля" этой статьи показано, как соединитель служб упрощает процесс подключения.

Веб-приложение использует класс DefaultAzureCredential клиентской библиотеки Python Azure Identity для автоматического обнаружения наличия управляемого удостоверения и доступа к другим ресурсам.

Необходимые условия

  • Подписка Azure с разрешениями на запись и назначение ролей для ресурсов учебника в регионе Azure, который поддерживает Service Connector и имеет достаточные квоты и поддержку службы приложений.

  • Azure Cloud Shell для выполнения инструкций руководства или локального выполнения:

    1. Установите Azure CLI версии 2.87.0 или более поздней. Чтобы проверить версию, выполните команду az version. Чтобы обновить, выполните команду az upgrade.
    2. Установите Python 3.
    3. Установка Git.
    4. Войдите в Azure с помощью az login и следуя инструкциям.

Настройка среды

  1. Зарегистрируйте поставщиков ресурсов Microsoft.ServiceLinker и Microsoft.DBforPostgreSQL в своей подписке.

    az provider register --namespace Microsoft.ServiceLinker
    az provider register --namespace Microsoft.DBforPostgreSQL
    
  2. Установите последнюю версию расширения Service Connector без пароля. --upgrade Параметр обновляет расширение, если оно уже установлено:

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

Клонируйте образец приложения

Important

Репозиторий образцов учебника был архивирован 15 июня 2026 года и больше не поддерживается активно. Используйте его только для прохождения этого туториала.

  1. Клонируйте пример репозитория приложений.

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

    В качестве альтернативы вы можете скачать приложение из репозитория serviceconnector-webapp-postgresql-django-passwordless и распаковать его в папку serviceconnector-webapp-postgresql-django-passwordless.

  2. Измените каталоги в папку репозитория с помощью cd serviceconnector-webapp-postgresql-django-passwordless и выполните все остальные команды из этой папки.

В примере приложения настройки продакшна веб-приложения находятся в файле azureproject/production.py . Настройки разработки находятся в azureproject/settings.py. Рабочие параметры настраивают Django для запуска в любой рабочей среде и не относятся к службе приложений.

Приложение использует рабочие параметры при задании переменной WEBSITE_HOSTNAME среды. App Service устанавливает эту переменную на имя хоста приложения, например msdocs-django.azurewebsites.net.

Дополнительные сведения см. в контрольном списке развертывания Django. Также см. параметры Production для Django на Azure.

Определение начальных переменных среды

Следующий код определяет необходимые переменные среды для этого руководства.

  • LOCATION должен быть регионом Azure, где ваша подписка имеет достаточную квоту для создания ресурсов и обеспечивает неограниченный доступ к База данных Azure для PostgreSQL.
  • Пароль администратора PostgreSQL должен содержать от 8 до 128 символов как минимум из трёх из этих категорий: заглавные, строчные буквы, цифры и небуквенно-цифровые символы. Не используйте $ пароль для этого урока.
  1. Настройте следующие переменные среды, заменяя <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, не отображая его и не добавляя в историю оболочки:

    read -s -p "PostgreSQL administrator password: " ADMIN_PW && echo
    
  3. Создайте группу ресурсов , чтобы содержать все ресурсы проекта. Имя группы ресурсов кэшируется и автоматически применяется к следующим командам.

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

Развертывание кода приложения в Службе приложений

Создайте хост приложения в App Service, включите автоматизацию сборки и развернуте примерный код приложения. План App Service уровня Basic (B1), используемый в этом учебнике, влечёт расходы в вашей подписке Azure. Актуальные цены смотрите в разделе App Service.

  1. Файл requirements.txt архивного примера не содержит сервера Gunicorn, который используется в start.sh. Добавьте его в свою локальную копию, если его там ещё нет:

    grep -qiE "^gunicorn([=<>~ ]|$)" requirements.txt || echo "gunicorn" >> requirements.txt
    
  2. Создайте план Linux App Service в уровне цен Basic (B1), а затем создайте веб-приложение с помощью команды запуска из примера:

    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. Включите автоматизацию сборки App Service так, чтобы развертывание устанавливало пакеты в requirements.txt:

    az webapp config appsettings set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
    
  4. Из корня репозитория создайте ZIP-файл примерного приложения и развернуте его с помощью 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
    

    Команда развертывания выполняется успешно, когда App Service принимает ZIP-файл. Сборка продолжается в App Service и может занять несколько минут.

Создайте базу данных PostgreSQL в Azure

Создайте Azure Database Database for PostgreSQL — гибкий сервер и базу данных для хранения данных приложений.

  1. Создайте сервер База данных Azure для 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
    

    Команда успешно выполняется, когда состояние гибкого сервера PostgreSQL равно Succeeded.

  2. Удалите пароль администратора из текущей оболочки после создания сервера:

    unset ADMIN_PW
    
  3. Создайте базу данных с помощью 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
    

Создание подключения службы без пароля

Используйте az webapp connection, создайте postgres-flexible для добавления сервисного коннектора, который подключает веб-приложение Azure к базе данных PostgreSQL с помощью управляемой идентификационной аутентификации без пароля. Следующая команда настраивает База данных Azure для PostgreSQL для использования управляемого удостоверения и ролевого управления доступом в Azure. В выходных данных команды перечисляются действия, выполняемые Service Connector.

Команда создаёт параметр приложения с именем AZURE_POSTGRESQL_CONNECTIONSTRING, который содержит информацию о подключении к базе данных. В примере считывается эта настройка в azureproject/production.py. Дополнительные сведения см. в разделе "Переменные среды Access".

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

Подключение будет готово, когда команда сообщит о подключении к гибкому серверу PostgreSQL и создаст параметр приложения AZURE_POSTGRESQL_CONNECTIONSTRING.

Подключите веб-приложение Django к служба хранилища Azure с помощью Service Connector

Создайте аккаунт хранения Azure, а затем используйте az webapp connection create storage-blob для подключения к веб-приложению. Команда соединения выполняет следующие действия:

  • Включает системно назначаемое управляемое удостоверение для веб-приложения.
  • Добавляет веб-приложение с ролью Storage Blob Data Contributor в учетную запись хранения.
  • Настраивает сеть учетной записи хранения для приема доступа из веб-приложения.
  • Создает переменную среды с именем AZURE_STORAGEBLOB_RESOURCEENDPOINT для учетной записи служба хранилища Azure.

Создание учетной записи служба хранилища Azure

Создайте учетную запись хранения общего назначения v2 с локально избыточным хранилищем:

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

Создайте соединение без пароля для хранения

Создайте безпарольное соединение с аккаунтом хранения:

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

Подключение готово, когда команда выводит сведения о подключении к учётной записи хранения и создаёт параметр приложения AZURE_STORAGEBLOB_RESOURCEENDPOINT.

Настройте контейнер с образцами фото

  1. Обновите аккаунт служба хранилища Azure, чтобы предоставить публичный доступ к blob-ам для этого архивированного примера приложения.

    Примечание.

    Этот архивированный образец использует прямые URL blob для отображения фотографий, поэтому учебник обеспечивает анонимный доступ к photos контейнеру. Эта настройка специфична для сэмпла и не требуется для Service Connector. Для производственных приложений сохраняйте контейнеры в приватности и используйте контролируемый способ доставки, например, аутентифицированную конечную точку приложения.

    az storage account update \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --allow-blob-public-access true
    
  2. Назначьте авторизованное пользователю разрешение на создание контейнера с помощью аутентификации 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
    

    Настройка MSYS_NO_PATHCONV этой команды не позволяет Git Bash на Windows преобразовать идентификатор ресурсов Azure в путь Windows. Он не действует в Azure Cloud Shell или других Bash-средах. Может потребоваться несколько минут, чтобы назначения ролей вступили в силу.

  3. Используйте az storage container create, чтобы создать контейнер с именем photos и разрешить анонимный доступ на чтение к большим двоичным объектам в этом контейнере:

    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
    

    Контейнер готов, когда в ответе для контейнера photos отображается "created": true.

Тестирование веб-приложения Python в Azure

Откройте и проверьте веб-приложение Azure "Обзор ресторана". Приложение использует пакет azure.identity и его DefaultAzureCredential класс. Когда приложение выполняется в Azure, DefaultAzureCredential автоматически обнаруживает, когда управляемое удостоверение существует у службы приложений, и использует его для доступа к ресурсам служба хранилища Azure и База данных Azure для PostgreSQL. Приложению не нужно предоставлять ключи хранения, сертификаты или учетные данные для доступа к этим ресурсам.

  • Для локальной установки Azure CLI можно использовать az webapp browse для открытия приложения в браузере по умолчанию:

    az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell не удается открыть локальный браузер, поэтому он не поддерживает команду az webapp browse. Из Cloud Shell выберите ссылку на домен по умолчанию в правом верхнем углу страницы портала Azure приложения.

Для запуска приложения может потребоваться несколько минут. Если вы видите страницу приложения по умолчанию, которая не является примером приложения, подождите минуту и обновите браузер.

Проверьте функциональные возможности примера приложения, добавив ресторан и некоторые отзывы с фотографиями. Приложение должно выглядеть следующим образом:

Скриншот примера веб-приложения для обзоров ресторана, показывающий запись в ресторане с отзывом клиента и загруженной фотографией.

Очистка ресурсов

Чтобы избежать текущих расходов, можно удалить ресурсы, созданные для этого руководства, удалив группу ресурсов, содержащую их. Перед выполнением команды убедитесь, что приложение или ресурсы больше не нужны.

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

Команда возвращается сразу, а Azure удаляет ресурсы.

Troubleshooting

Если приложение не запускается или не подключается к своим ресурсам, проверьте журналы развертывания App Service, убедитесь, что параметры приложения AZURE_POSTGRESQL_CONNECTIONSTRING и AZURE_STORAGEBLOB_RESOURCEENDPOINT существуют, и подождите несколько минут, чтобы назначения ролей Azure вступили в силу. По вопросам запуска приложений на Python см. следующую статью: