Рубрики
Без рубрики

Развертывание приложения Flask в Heroku

Автор оригинала: Ali Abdelaal.

Вступление

В этом уроке вы узнаете, как развернуть приложение Flask в Heroku. Приложение может быть таким же простым, как приложение “Hello World” для платформы мониторинга социальных сетей!

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

Сегодня вы узнаете, как создать API с помощью Flask в качестве примера развертывания вашего приложения на Heroku.

Создание REST API с помощью Flask

В вашем каталоге проекта давайте начнем с создания virtualenv:

$ python -m venv venv/

И давайте активируем его с помощью команды source :

$ source venv/bin/activate

Затем давайте используем pip для установки библиотек, которые мы собираемся использовать – flask для создания приложения и gunicorn в качестве нашего сервера:

$ pip install flask
$ pip install gunicorn

Наше приложение будет представлять собой простой API, который получает имя и возвращает приветственное сообщение:

# app.py
from flask import Flask, request, jsonify
app = Flask(__name__)

@app.route('/getmsg/', methods=['GET'])
def respond():
    # Retrieve the name from url parameter
    name = request.args.get("name", None)

    # For debugging
    print(f"got name {name}")

    response = {}

    # Check if user sent a name at all
    if not name:
        response["ERROR"] = "no name found, please send a name."
    # Check if the user entered a number not a name
    elif str(name).isdigit():
        response["ERROR"] = "name can't be numeric."
    # Now the user entered a valid name
    else:
        response["MESSAGE"] = f"Welcome {name} to our awesome platform!!"

    # Return the response in json format
    return jsonify(response)

@app.route('/post/', methods=['POST'])
def post_something():
    param = request.form.get('name')
    print(param)
    # You can add the test cases you made in the previous function, but in our case here you are just testing the POST functionality
    if param:
        return jsonify({
            "Message": f"Welcome {name} to our awesome platform!!",
            # Add this option to distinct the POST request
            "METHOD" : "POST"
        })
    else:
        return jsonify({
            "ERROR": "no name found, please send a name."
        })

# A welcome message to test our server
@app.route('/')
def index():
    return "

Welcome to our server !!

" if __name__ == '__main__': # Threaded option to enable multiple instances for multiple user access support app.run(threaded=True, port=5000)

Чтобы протестировать ваше приложение локально, давайте нажмем кнопку http://127.0.0.1:5000/ конечная точка. Если все в порядке, мы должны быть встречены приветственным сообщением:

приветственное сообщение

Мы также можем отправить имя в качестве параметра, например http://localhost:5000/getmsg/?name=Mark :

{"MESSAGE":"Welcome Mark to our awesome platform!!"}

Когда ваше приложение готово, давайте развернем его в Хероку .

Хероку

Heroku является одной из первых облачных платформ как сервис (PaaS) и поддерживает несколько языков – Ruby, Java, Node.js, Scala, Clojure, Python, PHP и Go.

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

Чтобы достичь этого, нам нужно создать requirements.txt файл со всеми модулями:

$ pip freeze > requirements.txt

Таким образом, мы получаем requirements.txt файл, содержащий библиотеки, которые мы используем, и их версии:

Click==7.0
Flask==1.1.1
gunicorn==19.9.0
itsdangerous==1.1.0
Jinja2==2.10.1
MarkupSafe==1.1.1
Werkzeug==0.15.6

Примечание: Одной из распространенных ошибок является неправильное написание требований, это настоящая боль, когда вы часами отлаживаете свой код и обнаруживаете, что приложение не запускается из-за того, что сервер не загрузил модули. Единственный способ для Heroku узнать модули, которые вы используете, – это добавить их в requirements.txt файл, так что будьте осторожны!

Чтобы Heroku мог запускать наше приложение так, как оно должно, нам нужно заранее определить набор процессов/команд, которые оно должно запускать. Эти команды находятся в Профиле :

web: gunicorn app:app

Команда web указывает Heroku запустить веб-сервер для приложения, используя gunicorn . Так как наше приложение называется app.py , мы также установили имя app как app .

Счет Heroku

Теперь мы должны создать учетную запись Heroku .

Как только это будет сделано, на панели мониторинга выберите New -> Create new app :

новое приложение

Выберите имя для приложения и выберите регион, в котором вы хотите его разместить:

именование приложений

Как только приложение будет создано на Heroku, мы будем готовы развернуть его онлайн.

Мерзавец

Чтобы загрузить наш код, мы будем использовать Git . Во-первых, давайте сделаем репозиторий git:

$ git init .

А теперь давайте добавим наши файлы и зафиксируем :

$ git add app.py Procfile requirements.txt
$ git commit -m "first commit"

Развертывание приложения в Heroku

Чтобы окончательно развернуть приложение, нам нужно будет установить Heroku CLI , с помощью которого мы будем запускать команды, связанные с Heroku. Давайте войдем в вашу учетную запись, используя наши учетные данные, выполнив команду:

$ heroku login -i

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

$ heroku login

На этом этапе, войдя в систему, мы должны добавить наш репозиторий в удаленный:

$ heroku git:remote -a {your-project-name}

Обязательно замените {your-project-name} фактическим именем вашего проекта, выбранным на предыдущем шаге.

И когда это будет сделано, давайте загрузим проект, нажав его на Heroku:

$ git push heroku master

На вашем терминале должен появиться длинный журнал прогресса, заканчивающийся словами:

...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 45.1M
remote: -----> Launching...
remote:        Released v4
remote:        https://{your-project-name}.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/{your-project-name}.git
   ae85864..4e63b46  master -> master

Поздравляем, вы успешно загрузили свое первое веб-приложение в Heroku! Теперь пришло время протестировать и проверить наш API.

Тестирование API

В журнале, который был показан в консоли, вы найдете ссылку для вашего приложения https://{your-project-name}.herokuapp.com/ , эту ссылку также можно найти на вкладке Настройки в разделе Домены и сертификаты :

url-адрес приложения

Перейдя по ссылке, мы можем перейти к нашему приложению, которое теперь находится в сети и общедоступно:

приветственное сообщение

В случае возникновения каких-либо ошибок вы можете получить доступ к журналам и устранить неполадки оттуда:

ссылка на журнал

Вы можете вручную протестировать свое приложение в браузере, введя URL-адрес и добавив путь к маршруту /getmsg/|. Хотя, поскольку приложения, как правило, становятся все более и более сложными, рекомендуется использовать такие инструменты, как Postman .

Теперь давайте протестируем запрос GET к нашему приложению с параметром name :

локальный запрос с параметрами

Теперь давайте протестируем URL-адрес, который не привязан ни к какой функции , например /new url , с помощью запроса GET:

новый url

Как и ожидалось, наше приложение Flask вернуло ответ 404.

Примечание: Вы можете изменить вид вывода из Pretty , Raw и Preview , которые показывают вам , как будет выглядеть вывод в вашем браузере.

Теперь давайте протестируем POST запрос:

почтовый запрос

Кроме того, давайте посмотрим, что произойдет, если мы полностью опустим параметр name :

{"ERROR":"no name found, please send a name."}

Мы протестировали наше приложение и подтвердили, что все работает нормально. Чтобы увидеть историю вашего сервера и какие запросы были сделаны вы можете проверить журналы для вашего сайта через Heroku:

Журнал Heroku

Вы можете увидеть здесь POST запрос, который мы сделали на нашу страницу /post/|.

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

Вывод

В этой статье мы показали простой пример построения нашего первого простого API на Heroku с использованием микро-фреймворка Flask. Процесс разработки остается таким же, как и при создании приложения.

Heroku предлагает бесплатный план и студенческие планы. Бесплатный план ограничен, но он довольно хорошо работает, например, для стартового приложения, POC или простого проекта. Однако если вы хотите масштабировать свое приложение, то вам следует рассмотреть один из планов, доступных на сайте по адресу here .

Для получения дополнительной информации о Heroku вы можете проверить само руководство Heroku .