развертыванию веб-приложения Python (Django или Flask) с PostgreSQL в Azure

В этом руководстве вы развернете веб-приложение Python на основе данных (Django или Flask) в службе приложение Azure с помощью службы реляционной базы данных База данных Azure для PostgreSQL. поддержка службы приложение AzurePython в среде сервера Linux.

An architecture diagram showing an App Service with a PostgreSQL database in Azure.

Чтобы завершить работу с этим руководством, вам потребуется:

Перейти к концу

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

azd auth login
azd init --template msdocs-flask-postgresql-sample-app
azd up

Пример приложения

Примеры приложений Python, использующих платформу Flask и Django, помогут вам выполнить инструкции в этом учебнике. Чтобы развернуть их без локального запуска, пропустите эту часть.

Чтобы запустить приложение локально, убедитесь, что на локальном компьютере установлен Python 3.7 или более поздней версии и PostgreSQL . Затем клонируйте ветвь примера репозитория starter-no-infra и перейдите в корневой каталог репозитория.

git clone -b starter-no-infra https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app
cd msdocs-flask-postgresql-sample-app

Создайте файл .env, как показано ниже, используя файл .env.sample в качестве руководства. Настройте для параметра DBNAME имя существующей базы данных в локальном экземпляре PostgreSQL. Задайте значения DBHOST, DBUSER и DBPASS в соответствии с настройками локального экземпляра PostgreSQL.

DBNAME=<database name>
DBHOST=<database-hostname>
DBUSER=<db-user-name>
DBPASS=<db-password>

Создайте виртуальную среду для приложения:

py -m venv .venv
.venv\scripts\activate

Установка зависимостей:

pip install -r requirements.txt

Запустите пример приложения со следующими командами:

# Run database migration
flask db upgrade
# Run the app at http://127.0.0.1:5000
flask run

1. Создание Служба приложений и PostgreSQL

git clone https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app.git

В этом шаге вы создадите ресурсы Azure. Действия, используемые в этом руководстве, создают набор безопасных ресурсов по умолчанию, включающих Служба приложений и База данных Azure для PostgreSQL. В процессе создания вы укажете следующее:

  • Имя веб-приложения. Это имя используется в составе DNS-имени вашего веб-приложения в виде https://<app-name>.azurewebsites.net.
  • Регион для физического запуска приложения.
  • Стек среды выполнения для приложения. Здесь вы выбираете версию Python, используемую для вашего приложения.
  • План размещения для приложения. Это ценовая категория, которая включает набор функций и емкость масштабирования для вашего приложения.
  • Группа ресурсов для приложения. Группа ресурсов позволяет группировать (в логическом контейнере) все ресурсы Azure, необходимые для приложения.

Войдите на портал Azure и выполните следующие действия, чтобы создать ресурсы Службы приложений Azure.

Шаг 1. В портал Azure:

  1. Введите "веб-приложение база данных" в строке поиска в верхней части портала Azure.
  2. Выберите элемент с меткой Веб-приложение и база данных под заголовком Marketplace. Вы также можете перейти напрямую к мастеру создания.

A screenshot showing how to use the search box in the top tool bar to find the Web App + Database creation wizard (Flask).

Шаг 2. На странице "Создание веб-приложения + база данных " заполните форму следующим образом.

  1. Группа ресурсов → выбрать создать и использовать имя msdocs-python-postgres-tutorial.
  2. Регион → любой ближайший к вам регион Azure.
  3. Имяmsdocs-python-postgres-XYZ, где XYZ является тремя случайными символами. Это имя должно быть уникальным в Azure.
  4. Стек среды выполнения → Python 3.10.
  5. База данныхPostgreSQL — гибкий сервер по умолчанию выбирается в качестве ядра СУБД. Имя сервера и имя базы данных также задаются по умолчанию соответствующими значениями.
  6. План размещения — Базовый. Позже, когда все будет готово, вы сможете вертикально увеличить масштаб до рабочей ценовой категории.
  7. Выберите Review + create (Просмотреть и создать).
  8. После завершения проверки щелкните Создать.

A screenshot showing how to configure a new app and database in the Web App + Database wizard (Flask).

Шаг 3. Развертывание занимает несколько минут. После завершения развертывания нажмите кнопку Перейти к ресурсу. Вы перейдете непосредственно в приложение Службы приложений, но будут созданы следующие ресурсы:

  • Группа ресурсов — Контейнер для всех созданных ресурсов.
  • План службы приложений — определяет вычислительные ресурсы для Службы приложений. Создается план Linux на уровне Базовый.
  • Служба приложений — представляет приложение и выполняется в плане службы приложений.
  • Виртуальная сеть — интегрирована с приложением Службы приложений и изолирует внутренний сетевой трафик.
  • База данных Azure для PostgreSQL гибкий сервер → доступен только из виртуальной сети. База данных и пользователь создаются на этом сервере.
  • Частная зона DNS зона → включает разрешение DNS сервера PostgreSQL в виртуальной сети.

A screenshot showing the deployment process completed (Flask).

2. Проверка параметров подключения

Мастер создания создал переменные подключения для вас уже в качестве параметров приложения. Параметры приложения — это один из способов сохранения секретов подключения из репозитория кода. Когда вы будете готовы переместить секреты в более безопасное расположение, ознакомьтесь со статьей по хранению в Azure Key Vault.

Шаг 1. На странице Служба приложений в меню слева выберите "Конфигурация".

A screenshot showing how to open the configuration page in App Service (Flask).

Шаг 2. На вкладке "Параметры приложения" на странице "Конфигурация" убедитесь, что AZURE_POSTGRESQL_CONNECTIONSTRING он присутствует. Это будет внедрено в среду выполнения в качестве переменной среды.

A screenshot showing how to see the autogenerated connection string (Flask).

Шаг 3. В терминале или командной строке выполните следующий скрипт Python, чтобы создать уникальный секрет: python -c 'import secrets; print(secrets.token_hex())' Скопируйте выходное значение, которое будет использоваться на следующем шаге.

3. Развертывание примера кода

На этом шаге вы настроите развертывание GitHub с помощью GitHub Actions. Это всего лишь один из множества способов развертывания в Службе приложений, но это также отличный способ обеспечения непрерывной интеграции в процессе развертывания. По умолчанию каждая команда git push из репозитория GitHub запускает действие сборки и развертывания.

Шаг 1. В новом окне браузера:

  1. Войдите в свою учетную запись GitHub.
  2. Перейдите к https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app.
  3. Выберите Создать вилку.
  4. Щелкните Создать вилку.

A screenshot showing how to create a fork of the sample GitHub repository (Flask).

Шаг 2. На странице GitHub откройте Visual Studio Code в браузере, нажав клавишу . .

A screenshot showing how to open the Visual Studio Code browser experience in GitHub (Flask).

Шаг 3. В Visual Studio Code в браузере откройте azureproject/production.py в обозревателе. См. переменные среды, используемые в рабочей среде, включая параметры приложения, которые вы видели на странице конфигурации.

A screenshot showing Visual Studio Code in the browser and an opened file (Flask).

Шаг 4. Вернитесь на страницу Служба приложений в меню слева выберите Центр развертывания.

A screenshot showing how to open the deployment center in App Service (Flask).

Шаг 5. На странице Центра развертывания:

  1. В поле Источник выберите GitHub. По умолчанию в качестве поставщика сборки выбрано GitHub Actions.
  2. Войдите в свою учетную запись GitHub и следуйте инструкциям по авторизации Azure.
  3. В поле Организация выберите свою учетную запись.
  4. В репозитории выберите msdocs-flask-postgresql-sample-app.
  5. В поле Ветвь выберите main.
  6. Сохраните параметр по умолчанию, чтобы добавить рабочий процесс.
  7. В разделе " Тип проверки подлинности" выберите удостоверение, назначаемое пользователем.
  8. В меню сверху выберите Сохранить. Служба приложений фиксирует файл рабочего процесса в выбранном репозитории GitHub в каталоге .github/workflows.

A screenshot showing how to configure CI/CD using GitHub Actions (Flask).

Шаг 6. На странице Центра развертывания:

  1. Выберите Журналы. Прогон развертывания уже запущен.
  2. В элементе журнала для прогона развертывания выберите Журналы сборки и развертывания.

A screenshot showing how to open deployment logs in the deployment center (Flask).

Шаг 7. Вы перейдете в репозиторий GitHub и увидите, что действие GitHub выполняется. Файл рабочего процесса определяет два отдельных этапа: сборку и развертывание. Дождитесь, пока в выполнении действия GitHub не будет показано состояние Завершено. Это занимает около 5 минут.

A screenshot showing a GitHub run in progress (Flask).

Возникли проблемы? Ознакомьтесь с руководством по устранению неполадок.

4. Создание схемы базы данных

С помощью базы данных PostgreSQL, защищенной виртуальной сетью, проще всего запустить миграцию баз данных Flask в сеансе SSH с контейнером Служба приложений.

Шаг 1. Назад на странице Служба приложений в меню слева

  1. Выберите SSH.
  2. Выберите Перейти.

A screenshot showing how to open the SSH shell for your app from the Azure portal (Flask).

Шаг 2. В терминале SSH выполните команду flask db upgrade. При успешном завершении Служба приложений успешно подключается к базе данных. После перезапуска приложения могут сохраняться только изменения в файлах в /home. Изменения за пределами /home не сохраняются.

A screenshot showing the commands to run in the SSH shell and their output (Flask).

5. Перейдите к приложению

Шаг 1. На странице Служба приложений:

  1. В меню слева выберите Обзор.
  2. Выберите URL-адрес своего приложения. Также можно перейти непосредственно по адресу https://<app-name>.azurewebsites.net.

A screenshot showing how to launch an App Service from the Azure portal (Flask).

Шаг 2. Добавьте в список несколько ресторанов. Поздравляем, вы запускаете веб-приложение в службе приложение Azure с безопасным подключением к База данных Azure для PostgreSQL.

A screenshot of the Flask web app with PostgreSQL running in Azure showing restaurants and restaurant reviews (Flask).

6. Потоковая передача журналов диагностики

Служба приложений Azure захватывает все сообщения, выводимые на консоль, чтобы помочь в диагностике проблем с приложением. Пример приложения включает инструкции print() для демонстрации этой возможности, как показано ниже.

@app.route('/', methods=['GET'])
def index():
    print('Request for index page received')
    restaurants = Restaurant.query.all()
    return render_template('index.html', restaurants=restaurants)

Шаг 1. На странице Служба приложений:

  1. В меню слева выберите Журналы службы приложений.
  2. Под элементом Ведение журнала приложения выберите Файловая система.
  3. В меню сверху выберите Сохранить.

A screenshot showing how to enable native logs in App Service in the Azure portal.

Шаг 2. В меню слева выберите поток журналов. Вы увидите журналы для своего приложения, включая журналы платформы и журналы из контейнера.

A screenshot showing how to view the log stream in the Azure portal.

Дополнительные сведения о ведении журнала в приложениях Python в серии о настройке Azure Monitor для приложения Python.

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

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

Шаг 1. В строке поиска в верхней части портал Azure:

  1. Введите имя группы ресурсов.
  2. Выберите группу ресурсов.

A screenshot showing how to search for and navigate to a resource group in the Azure portal.

Шаг 2. На странице группы ресурсов выберите "Удалить группу ресурсов".

A screenshot showing the location of the Delete Resource Group button in the Azure portal.

Шаг 3.

  1. Введите имя группы ресурсов для подтверждения удаления.
  2. Выберите команду Удалить.

A screenshot of the confirmation dialog for deleting a resource group in the Azure portal. :

1. Создание ресурсов Azure и развертывание примера приложения

На этом шаге вы создадите ресурсы Azure и развернете пример приложения для Служба приложений в Linux. Действия, используемые в этом руководстве, создают набор безопасных ресурсов по умолчанию, включающих Служба приложений и База данных Azure для PostgreSQL.

  1. Если вы еще не сделали этого, клонируйте ветвь примера репозитория starter-no-infra в локальном терминале.

    git clone -b starter-no-infra https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app
    cd msdocs-flask-postgresql-sample-app
    

    Эта клонированная ветвь является отправной точкой. Он содержит простое приложение Flask для дисков данных.

  2. Выполните команду azd initиз корневого каталога репозитория.

    azd init --template python-app-service-postgresql-infra
    
  3. При появлении запроса укажите следующие ответы:

    Вопрос Ответ
    Текущий каталог не пуст. Вы хотите инициализировать проект здесь в каталоге<>? Y
    Что вы хотите сделать с этими файлами? Сохранение существующих файлов без изменений
    Введите новое имя среды Введите уникальное имя. Шаблон azd использует это имя как часть DNS-имени веб-приложения в Azure (<app-name>.azurewebsites.net). Разрешены буквенно-цифровые символы и дефисы.
  4. azd up Выполните команду, чтобы подготовить необходимые ресурсы Azure и развернуть код приложения. Если вы еще не вошли в Azure, браузер запустит и попросит вас войти. Команда azd up также предложит выбрать нужную подписку и расположение для развертывания.

    azd up
    

    Выполнение azd up команды может занять несколько минут. Он также компилирует и развертывает код приложения, но вы измените код позже, чтобы работать с Служба приложений. Во время выполнения команда предоставляет сообщения о процессе подготовки и развертывания, включая ссылку на развертывание в Azure. По завершении команда также отображает ссылку на приложение развертывания.

    Этот шаблон azd содержит файлы (azure.yaml и инфракрасный каталог), создающие безопасную архитектуру по умолчанию со следующими ресурсами Azure:

    • Группа ресурсов — Контейнер для всех созданных ресурсов.
    • План службы приложений — определяет вычислительные ресурсы для Службы приложений. Указан план Linux на уровне B1 .
    • Служба приложений — представляет приложение и выполняется в плане службы приложений.
    • Виртуальная сеть — интегрирована с приложением Службы приложений и изолирует внутренний сетевой трафик.
    • База данных Azure для PostgreSQL гибкий сервер → доступен только из виртуальной сети. База данных и пользователь создаются на этом сервере.
    • Частная зона DNS зона → включает разрешение DNS сервера PostgreSQL в виртуальной сети.
    • Рабочая область Log Analytics → выступает в качестве целевого контейнера для вашего приложения для отправки журналов, где можно также запросить журналы.

2. Использование базы данных строка подключения

Шаблон azd, который вы используете, создали переменные подключения для вас уже в качестве параметров приложения и выводит их в терминал для удобства. Параметры приложения — это один из способов сохранения секретов подключения из репозитория кода.

  1. В выходных данных azd найдите параметры приложения и найдите параметры AZURE_POSTGRESQL_CONNECTIONSTRING и AZURE_REDIS_CONNECTIONSTRING. Чтобы обеспечить безопасность секретов, отображаются только имена параметров. Они выглядят следующим образом в выходных данных azd:

     App Service app has the following settings:
    
             - AZURE_POSTGRESQL_CONNECTIONSTRING
             - AZURE_REDIS_CONNECTIONSTRING
             - FLASK_DEBUG
             - SCM_DO_BUILD_DURING_DEPLOYMENT
             - SECRET_KEY
     
  2. AZURE_POSTGRESQL_CONNECTIONSTRINGсодержит строка подключения в базу данных Postgres в Azure и AZURE_REDIS_CONNECTIONSTRING содержит строка подключения в кэш Redis в Azure. Для подключения к нему необходимо использовать свой код. Откройте azureproject/production.py, раскомментируйте следующие строки и сохраните файл:

    conn_str = os.environ['AZURE_POSTGRESQL_CONNECTIONSTRING']
    conn_str_params = {pair.split('=')[0]: pair.split('=')[1] for pair in conn_str.split(' ')}
    DATABASE_URI = 'postgresql+psycopg2://{dbuser}:{dbpass}@{dbhost}/{dbname}'.format(
        dbuser=conn_str_params['user'],
        dbpass=conn_str_params['password'],
        dbhost=conn_str_params['host'],
        dbname=conn_str_params['dbname']
    )
    

    Теперь код приложения настроен для подключения к базе данных PostgreSQL в Azure. Если вы хотите, откройте app.py и посмотрите, как DATABASE_URI используется переменная среды.

  3. В окне терминале выполните команду azd deploy.

    azd deploy
    

4. Создание схемы базы данных

С помощью базы данных PostgreSQL, защищенной виртуальной сетью, проще всего запустить миграцию баз данных Flask в сеансе SSH с контейнером Служба приложений.

  1. В выходных данных azd найдите URL-адрес сеанса SSH и перейдите к нему в браузере. Это выглядит следующим образом в выходных данных:

     Open SSH session to App Service container at: https://<app-name>.scm.azurewebsites.net/webssh/host
     
  2. В терминале SSH выполните команду flask db upgrade. При успешном завершении Служба приложений успешно подключается к базе данных.

    A screenshot showing the commands to run in the SSH shell and their output (Flask).

    Примечание.

    После перезапуска приложения могут сохраняться только изменения в файлах в /home. Изменения за пределами /home не сохраняются.

5. Перейдите к приложению

  1. В выходных данных azd найдите URL-адрес приложения и перейдите к нему в браузере. URL-адрес выглядит следующим образом в выходных данных AZD:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: https://<app-name>.azurewebsites.net/
     
  2. Добавьте несколько ресторанов в список.

    Поздравляем, вы запускаете веб-приложение в службе приложение Azure с безопасным подключением к База данных Azure для PostgreSQL.

6. Потоковая передача журналов диагностики

служба приложение Azure может записывать журналы консоли для диагностики проблем с приложением. Для удобства шаблон azd уже включил ведение журнала в локальную файловую систему , а также доставку их в рабочую область Log Analytics.

Пример приложения содержит print() инструкции для демонстрации этой возможности, как показано в следующем фрагменте кода.

@app.route('/', methods=['GET'])
def index():
    print('Request for index page received')
    restaurants = Restaurant.query.all()
    return render_template('index.html', restaurants=restaurants)

В выходных данных azd найдите ссылку для потоковой передачи журналов Служба приложений и перейдите к нему в браузере. Ссылка выглядит следующим образом в выходных данных azd:

Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream

Дополнительные сведения о ведении журнала в приложениях Python в серии о настройке Azure Monitor для приложения Python.

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

Чтобы удалить все ресурсы Azure в текущей среде развертывания, выполните команду azd down.

azd down

Устранение неполадок

Ниже приведены проблемы, которые могут возникнуть при попытке работы с этим руководством и инструкциями по их устранению.

Не удается подключиться к сеансу SSH

Если вы не можете подключиться к сеансу SSH, само приложение не удалось запустить. Дополнительные сведения см. в журналах диагностики . Например, если вы видите ошибку, KeyError: 'AZURE_POSTGRESQL_CONNECTIONSTRING'это может означать, что переменная среды отсутствует (возможно, вы удалили параметр приложения).

При выполнении миграции базы данных возникает ошибка

При возникновении ошибок, связанных с подключением к базе данных, проверка, если параметры приложения (AZURE_POSTGRESQL_CONNECTIONSTRING) были изменены. Без этого строка подключения команда миграции не может взаимодействовать с базой данных.

Часто задаваемые вопросы

Сколько стоит такая конфигурация?

Цены на созданные ресурсы приведены следующим образом:

  • План службы приложений создается на уровне Базовый, и его можно масштабировать вверх или вниз. См. цены на Службу приложений.
  • Гибкий сервер PostgreSQL создается на самом низком уровне с максимальным объемом памяти Standard_B1ms с минимальным размером хранилища, который можно масштабировать вверх или вниз. Цены на Базу данных Azure для PostgreSQL.
  • Плата за виртуальную сеть не взимается, если только вы не настроите дополнительные функциональные возможности, такие как пиринг. См. цены на виртуальные сети Azure.
  • За частную зону DNS взимается небольшая плата. См. цены на Azure DNS.

Разделы справки подключиться к серверу PostgreSQL, защищенному за виртуальной сетью с другими средствами?

  • Для базового доступа из программы командной строки можно запустить psql из терминала SSH приложения.
  • Чтобы подключиться из классического средства, компьютер должен находиться в виртуальной сети. Например, это может быть виртуальная машина Azure, подключенная к одной из подсетей, или компьютер в локальной сети с VPN-подключением типа "сеть — сеть" к виртуальной сети Azure.
  • Вы также можете интегрировать Azure Cloud Shell с виртуальной сетью.

Как осуществляется разработка локальных приложений с использованием GitHub Actions?

Используя автоматически созданный файл рабочего процесса из Служба приложений в качестве примера, каждый git push запускает новую сборку и развертывание. Из локального клона репозитория GitHub необходимо внести необходимые обновления и отправить их в GitHub. Например:

git add .
git commit -m "<some-message>"
git push origin main

Как настроен пример Django для запуска в службе приложение Azure?

Примечание.

Если вы используете это руководство с собственным приложением, просмотрите описание файла requirements.txt в файле README.md проекта (Flask, Django), чтобы узнать, какие пакеты вам понадобятся.

Пример приложения Django настраивает параметры в файле azureproject/production.py, чтобы он мог работать в службе приложение Azure. Эти изменения являются общими для развертывания Django в рабочей среде, а не для Служба приложений.

  • Django проверяет заголовок HTTP_HOST в входящих запросах. Пример кода использует переменную среды в Служба приложений, чтобы добавить доменное имя приложения в параметр ALLOWED_HOSTS Django.WEBSITE_HOSTNAME

    # Configure the domain name using the environment variable
    # that Azure automatically creates for us.
    ALLOWED_HOSTS = [os.environ['WEBSITE_HOSTNAME']] if 'WEBSITE_HOSTNAME' in os.environ else []
    
  • Django не поддерживает обработку статических файлов в рабочей среде. В этом руководстве мы используем для обработки таких файлов WhiteNoise. Пакет WhiteNoise уже установлен с требованиями.txt, а его ПО промежуточного слоя добавляется в список.

    
    # WhiteNoise configuration
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        # Add whitenoise middleware after the security middleware
        'whitenoise.middleware.WhiteNoiseMiddleware',
    

    Затем параметры статических файлов настраиваются в соответствии с документацией Django.

    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
    

Дополнительные сведения см. в разделе "Рабочие параметры" для приложений Django.

Следующие шаги

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

Узнайте, как Служба приложений запускает приложение Python: