Развертывание приложения Flask на Heroku
В этом руководстве вы узнаете, как развернуть приложение Flask на Heroku в Python. Приложение может быть таким же простым, как приложение «Hello World» для платформы мониторинга социальных сетей!
В настоящее время нет бизнеса, у которого нет веб-приложения, которое помогло бы ему охватить большую аудиторию, или, возможно, предоставило бы свои услуги через онлайн-портал.
Сегодня вы узнаете, как создать API, используя Flask в качестве примера развертывания вашего приложения на Heroku.
Создание REST API с помощью Flask
В каталоге вашего проекта давайте начнем с создания virtualenv:
$ python -m venv venv/
И активируем его исходной командой:
$ 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 "<h1>Welcome to our server !!</h1>"
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.
Что такое Heroku?
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 мог запускать наше приложение, как должно, нам нужно заранее определить набор процессов или команд, которые оно должно запускать. Эти команды находятся в Procfile:
web: gunicorn app:app
Веб-команда сообщает Heroku о необходимости запустить веб-сервер для приложения, используя gunicorn. Поскольку наше приложение называется app.py, мы также установили имя приложения как app.
Создание аккаунта
Теперь мы должны создать учетную запись Heroku.
Как только это будет решено, на панели инструментов выберите New -> Create new app:
Выберите имя для приложения и регион, в котором вы хотите разместить его:
Как только приложение будет создано на Heroku, мы готовы развернуть его в Интернете.
Git
Чтобы загрузить наш код, мы воспользуемся Git. Для начала создадим репозиторий git:
$ git init .
А теперь давайте добавим наши файлы и зафиксируем:
$ git add app.py Procfile requirements.txt $ git commit -m "first commit"
Развертывание приложения
Чтобы окончательно развернуть приложение, нам нужно установить Heroku CLI, с помощью которого мы будем запускать команды. Давайте войдем в нашу учетную запись, используя наши учетные данные, выполнив команду:
$ 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-адрес и добавив путь для /getmsg/route. Поскольку приложения становятся все более сложными, рекомендуется использовать такие инструменты, как Postman.
Теперь давайте протестируем GET-запрос к нашему приложению с параметром имени:
Теперь давайте протестируем URL-адрес, который не привязан к какой-либо функции, например, /newurl, с помощью запроса GET:
Как и ожидалось, наше приложение Flask вернуло ответ 404.
Примечание. Вы можете изменить вид вывода из Pretty, Raw и Preview, который показывает, как вывод будет выглядеть в вашем браузере.
Теперь протестируем POST-запрос:
Также посмотрим, что произойдет, если мы полностью опустим параметр name:
{"ERROR":"no name found, please send a name."}
Мы протестировали наше приложение и подтвердили, что все работает нормально. Чтобы увидеть историю вашего сервера и какие запросы были сделаны, вы можете проверить logs вашего сайта через Heroku:
Вы можете увидеть здесь POST-запрос, который мы отправили на нашу страницу /post/.
Также вы можете увидеть историю создания приложения. Более того, если во время сборки возникнут какие-либо проблемы, вы можете найти их на странице журнала.
Заключение
В этой статье мы показали простой пример создания нашего первого простого API на Heroku с использованием микросхемы Flask. Процесс разработки остается прежним, пока вы продолжаете создавать свое приложение.
Heroku предлагает бесплатный и студенческий план. Бесплатный план ограничен, но он неплохо работает, например, для начального приложения, POC или простого проекта.
Автор