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

Правильный путь ™, чтобы сделать безверенно в Python (часть 2)

Как строить серверы без сервеса в Python с помощью Zappa и Chalice. Теги с Python, Django, AWS, Serverless.

Примечание: эта статья была авторизована Майкл Лаверы

В Часть 1 Мы покрывали базовые основы без промежутков и заставили наши ноги мокрыми безвесовыми каркасами. Если вы еще не читали эту часть, это очень поощряется, что вы начнете там. Предполагая, что вы следите в части 1, теперь вы знаете, как создать и развернуть простой AWS Lambda функции в Python; Включая веб-API с помощью Gateway AWS API. Но мы только что поцарапали только поверхность того, что вы можете сделать в безрусете с Python. В этом посте мы введем библиотеку, которая позволяет подключить любую веб-каркас, которая говорит WSGI на безсетербенде (почти все они); И мы посмотрим на собственную веб-каркас Python AWS для создания веб-API.

Zappa

Zappa , названный в честь легендарного Frank Zappa, является оригинальной библиотекой/рамки/рамки для Python ServeLes. Первоначально он был задуман как Django-Zappa, библиотека, позволяющая развернуть веб-приложения Django для AWS LAMBDA. С тех пор он выращивается в прыжках и границах, и теперь поддерживает любые совместимые WSGI Python Web Framework. Он также расширил его набор функций и очень много «аккумуляторы включены» инструмент для создания, развертывания и управления веб-приложениями без сервеса, написанные в Python.

Что такое WSGI?

Если вы сделали Python Web Development раньше, вы, вероятно, слышали о WSGI. Но что это? WSGI означает «интерфейс Gateway Web Server», и он является реализацией интерфейса между веб-серверами и веб-приложениями/каркасами. Это было Создано сообществом Python Вернувшись в 2003 году, потому что не было стандартного способа разработки веб-приложения в Python тогда. Вместо этого вы сначала пришлось выбрать веб-сервер, который может использовать CGI, FastCGI, Mod_Python или что-то другое, полностью и развиваться против этого. Что означало, что ваше веб-приложение было очень связано с веб-сервером, в котором он был построен (запомнить Zope?). Теперь у нас есть WSGI и все современные веб-каркасы Python Web, которые означает, что вы можете использовать любой веб-сервер, который вам нравится – или нет сервера вообще? Да, благодаря Zappa, WSGI тоже поддерживается через Serverless.

Причина, по которой я ссылаюсь на Заппу как «библиотека/рамки», заключается в том, что оно вроде жизни в обоих мирах. Zappa in Ite Core – это слой совместимости/перевода между серверу и WSGI. Например, с aws lambda Zappa принимает HTTP-событие, которое мы покрыты частью 1 и преобразуем его в совместимое в WSGI эквивалентное представление, что все веб-каркасы WSGI могут использовать. Это то, где Zappa чувствует себя как «библиотека», но затем Zappa упаковывает тонну полезных функций сверху и начинает больше похожи на «рамки». Хотя, как WSGI, Zappa очень много агностики, когда речь идет о реальном использовании веб-структуры.

Какую веб-каркас следует использовать?

Если вы задаете этот вопрос, то я бы порекомендовал вам начать с Джанго или Колбу Отказ Django является самым популярным веб-структурами в Python и очень много «аккумуляторных батарей». Фляша, возможно, вторая самая популярная веб-каркас в Python и называет собой «микроформация»; У него есть более простые API и не приходит со всеми колоколами и свистами, которые Django делает. Оба отличные варианты и очень хорошо документированы. В этом посте мы сосредоточимся на этих двух веб-каркасах, когда дело доходит до Zappa, но Zappa должен работать с довольно Любой веб-каркас Python Отказ Достаточно сказать, если вы используете бутылку, пирамиду, торнадо, сокол или что-то еще – это должно быть легко получить ваше веб-приложение, запущенную через Serverless с помощью Zappa.

Джанго встречает Заппу

Как мы упомянули в части 1, правило для новых программ Python Westerness является использование Python 3.6 и True для формы, Django имеет Упал Python 2.7 Поддержка В Джанго 2.0. Это может показаться печальным днем для всех лоялистов Python 2.7, но плюсы значительно перевешивают минусы здесь. Подумай об этом: Нет больше шесть . Только одна должна поставить улыбку на ваше лицо – по крайней мере, пока Python 4 не выпущен.

Теперь, прежде чем нырять в Заппу, нам сначала нужно создать веб-приложение Django. Django делает это действительно легко:

pip install -U django
django-admin startproject mydjangoapp
cd mydjangoapp

Это установит последнюю версию Джанго Использование Пип и Django-Admin StartProject Команда создаст каталог под названием MyDjangoApp С предварительно настроенным веб-приложением Django готов к работе. Теперь, если вы сделали Python Web Development раньше, вы, вероятно, спрашиваете: «А как насчет виртуальна? «Если вы не знаете, что такое« Virtualenv », это лучшая практика в Python, чтобы создать« виртуальную среду »для каждого проекта, чтобы все ваши зависимости оставались в одном месте и не получаем перепутаны с другими проектами. Есть несколько инструментов, чтобы облегчить управление виртуальными средами. Например, тот, кто набирает много тяги недавно, это Кеннет Рейтц Пипнв Отказ Если вы не знаете, кто то есть, он парень позади Запросы Вы, вероятно, знаете его работу. Но я все еще частично для VirtualenVwrapper Я собираюсь лечить виртуальные среды как личные предпочтения. Это все еще лучшая практика, хотя, поэтому выберите тот, какой инструмент подходит для вашего рабочего процесса лучше всего.

Теперь, когда у нас создано проект Django, и мы в нашем MyDjangoApp Каталог давайте подстреливаться заппа:

pip install -U zappa
zappa init

Заппа собирается задать ряд вопросов о вашем веб-приложении. На данный момент вы можете придерживаться по умолчанию, которые предлагает Zappa. Как мы упомянули в части 1, вроде с рамками без сердца, Zappa собирается проверить, что ваши учетные данные AWS правильно настроены . Если у вас есть несколько профилей AWS-профили, Zappa Wil спросил, какой из них использовать, но если у вас есть только один, то по умолчанию вы хотите. После запуска Zappa init и отвечая на вопросы, вы обнаружите, что Zappa создал zappa_settings.json Файл в вашем каталоге проекта. Этот файл обслуживает ту же цель, что и Serverless.yml В части 1, но потому что это JSON Нет комментариев. К счастью, Заппа Документы доступные настройки.

Теперь развернуть:

zappa deploy dev

Zappa выполнит шаги, аналогичные структуру без прослушивания, охватываемые частью 1, но из-за коробки он сделает некоторые удобные, специфичные для питона, такие как зависимости от нас. Как только это сделано развертывание, вы должны увидеть что-то вроде этого:

Deployment complete!: https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev

Если вы прочитали часть 1, это будет выглядеть знакомым. Это URL-адрес AWS API Gateway. Давайте откроем его в браузере и посмотрим, что мы получаем:

DisallowedHost at /

Invalid HTTP_HOST header: 'xxxxxxxxxx.execute-api.us-east-1.amazonaws.com'. You may need to add 'xxxxxxxxxx.execute-api.us-east-1.amazonaws.com' to ALLOWED_HOSTS.

Хм. Хорошо, давайте сделаем это. Откройте mydjangoapp/settings.py и искать Разрешенные_ходки Установка и изменить его на следующее:

ALLOWED_HOSTS = [".execute-api.us-east-1.amazonaws.com"]

Почему мы не включаем в себя xxxxxxxxxx часть? Ну, эта часть имена хоста склонна к изменению. Например, если вы решите развернуть промежуточную или производственную среду с Zappa, то эта часть имени хоста будет отличаться. Установка вашего Разрешенные_хосты Этот способ позволяет поддерживать все условия, которые вы развертываете с Zappa в AWS US-East-1 Отказ Если вы решите развернуть в другом регионе AWS, вам нужно будет обновить свой Разрешенные_ходки соответственно. Давайте сохраним и повторно развернуть:

zappa update dev

Уведомление здесь команда – Zappa Update И не Zappa Deploy . Это потому, что большая часть вашего веб-приложения без сервеса уже развернута. Все, что нам нужно сделать сейчас, это заменить наш пакет в ведре S3 Zappa, созданный для нас. Вы должны заметить, что Zappa Update заметно работает быстрее. Однажды сделано, давайте перезагрузим нашу https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev URL в браузере:

Page not found  (404)

Хорошо, мы добиваемся. Причина, причина, которую мы получаем ошибку «страницы не нашли», это то, что Django не настраивает страницу для / по умолчанию. Давайте исправим это. Во-первых, нам нужно будет создать приложение Django в нашем проекте. Веб-приложение Django состоит из «приложений». Скажите, что в вашем веб-приложении был блог и магазин, каждый из которых будет «приложение» в вашем проекте Django. Чтобы создать приложение:

python manage.py startapp myapp

Эта команда создаст MyApp каталог в вашем проекте. Внутри этого каталога являются горсткой модулей для поддержки приложения. Но прежде чем мы начнем работать над нашим приложением, мы должны сначала зарегистрировать его в нашем проекте Django. Для этого нам нужно открыть наши mydjangoapp/settings.py снова и ищите Stall_apps параметр. Там мы хотим добавить наше приложение к концу списка, поэтому он должен выглядеть что-то подобное:

INSTALLED_APPS = [
    ...
    'myapp',
]

Обратите внимание, что Stall_apps будет иметь несколько приложений Django уже установленных. Мы хотим сохранить их и просто добавить новое приложение в список. Итак, .... Представляет все приложения Django, которые уже настроены. Сохраните этот файл и откройте mydjangoapp/urls.py Отказ Этот файл находится в том, где django настраивает все маршруты нашего веб-приложения. На самом деле, если вы заметите, есть уже настроен маршрут:

urlpatterns = [
    path('admin/', admin.site.urls),
]

Интересно. Что делать, если мы открываем https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/admin/ в браузере? Как насчет этого. Приложение администратора Django уже там работает. К сожалению, мы не настроили пользователей в нашем проекте Django, поэтому мы не сможем выйти за рамки этой страницы входа в систему. Вернуться к тому, что мы изначально делали. Давайте добавим маршрут для / и подавать HTML шаблон. Сначала нам нужно импортировать Django’s TemplateView Отказ После От Django.urls Import Path Линия, добавьте следующее:

from django.views.generic import TemplateView

А потом обновите наши URLPatterns. вот так:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', TemplateView.as_view(template_name='index.html')),
]

Здесь мы настраиваем пустой маршрут, который эквивалентен / который должен быть обслуживан TemplateView используя template_name index.html. . Теперь, чтобы создать шаблон, нам нужно вернуться в наше приложение. Из нашего каталога проекта мы создаем Шаблоны каталог В нашем приложении и добавьте шаблон к нему:

mkdir myapp/templates
echo "

Hello Django

" > myapp/templates/index.html

Обратите внимание, что зовут шаблона index.html. Как мы указали в нашем URLS.PY Отказ Django автоматически загружает какие-либо шаблоны, которые он находит в любом из Stall_apps Предполагая, что Шаблоны каталог присутствует для этого приложения. Теперь повторно развернуть:

zappa update dev

И перезагрузить https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev В веб-браузере:

Hello Django

И так же, как у вас есть веб-приложение Serverless Django. Заппа действительно не мог сделать это легче. Развертывание того же приложения на обычный веб-сервер, на самом деле будет больше работы. Вы не рады, что вы бросили эти вещи?

Сейчас так же круто, как на складе Django, работающее на сервере, если мы вернемся к части 1, мы действительно стремимся построить веб-API и работников, верно? С Джанго, нам повезло, так как у него есть один из самых мощных и хорошо задокументированных рамок отдыха, называемых там Django Rest Framework . И если вы будете следовать за инструкции по установке У вас будет полнофункциональный API REST, работающий через SESERLELLE. Или если вы строите API GraphQL, то превосходное Графен интегрируется с Джанго.

Что касается работников, Zappa предлагает решение Не в отличие от того, что мы описали в части 1. Если у вас была функция называется SCLELED_JOB в MyApp/Tasks.py Что вы хотели выполнить каждые десять минут, вы откроете свой zappa_settings.json и добавьте следующее:

{
    "dev": {
       ...
       "events": [{
           "function": "myapp.tasks.scheduled_job",
           "expression": "rate(10 minutes)"
       }],
       ...
    }
}```
{% endraw %}


And then to deploy it:
{% raw %}


```bash
zappa schedule dev

И ты хорош, чтобы пойти. А как насчет пользовательских доменов? Zappa Вы покрыли там тоже. Прежде чем мы продолжим, предполагая, что вам не нужно это приложение, Zappa позволяет легко убирать:

zappa unschedule dev
zappa undeploy dev

Хотите узнать больше о Django? Проверьте Django Документация Отказ Или еще лучше, проверьте эти Учебники Django Отказ

Флэк встречает Заппу

Теперь, если настройка Django недостаточно просты, колба может быть еще проще. Предполагая, что мы начинаем с нового VirtualenV (см. Раздел Django для предложенных инструментов для создания VirtualenV). Сначала установите колбу и заппу:

pip install -U flask zappa

Затем создайте каталог проекта:

mkdir myflaskapp
cd myflaskapp

И в этом каталоге добавьте app.py со следующим:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return {'message': 'hi there'}

if __name__ == '__main__':
    app.run()

Тогда уволить заппу:

zappa init

Как и с нашим приложением Django, Zappa автоматически обнаруживает, что наше приложение использует колбу. И развернуть:

zappa deploy dev

И мы должны получить:

Deployment complete!: https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev

И проверить это:

curl https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev

Который должен вернуться:

{"message": "hi there"}

Поговорите о мгновенном веб-API. Так что здесь происходит? Заппа, вероятно, чувствует себя как волшебство, но это действительно просто умно. В Джанго WSGI выставлен в mydjangoapp/wsgi.py. . Таким образом, Zappa создает AWS Lambda обработчик для нас, который принимает HTTP-запросы. Этот обработчик преобразует эти запросы в эквивалентные запросы WSGI и передают их на mydjangoapp/wsgi.py. . С колбой, это в значительной степени та же идея. Единственное отличие состоит в том, что колба подвергает это WSGI через app.run () Метод в нашем app.py над.

Темы Zappa, которые мы покрыли уже с Django, также применимы к колбе. От запланированных заданий на пользовательские домены они все поддерживаются.

Хотите узнать больше о колбе? Проверьте Колбовая документация Отказ Или еще лучше, проверить это Flask Mega Tutorial Отказ

О, и не забудьте убирать:

zappa undeploy dev

Больше Zappa?

В этом посте мы только поцарапали поверхность того, что вы можете сделать с Zappa. Проверьте Запна Документация Для большего количества, в том числе о том, как откатывать развертывание, журналы хвоста, сохраняйте ваши функции теплыми, пожарные асинхронные рабочие места и т. Д.

Чаша

Если Zappa не вдохновил вас, чтобы начать строить веб-приложение Servelless Python, я не знаю, что будет, но он также, по-видимому, вдохновил (по крайней мере, частично) команду на AWS, чтобы начать свои собственные веб-каркасы, специально созданные для AWS LAMBDA. Они называют это Чаша Отказ

Этот проект интересен на пару причин. Во-первых, это один из немногих веб-каркасов Python, который не реализует WSGI. Хотя я был воском поэтичном на добродетелях WSGI, Chalice построен специально для AWS Lambda, и как таковой не нужен слой абстракции, такой как WSGI. Тренование здесь – простота для блокировки: Реализация чаши упрощена только на необходимость навесных aws лямбда, но это также означает, что вы можете использовать только чаша с AWS Lambda. Во-вторых, API Chalice четко влияет еще один веб-каркас, который мы уже освещали в этом посте, что помогает с кривой обучения. Какой из них спросишь? Давайте взглянем.

Предполагая, что мы начинаем со свежего виртуального, установите чашу с:

pip install -U chalice

И создать проект:

chalice new-project mychaliceapp

Эта команда создает каталог под названием MyChaliCeapp с предварительно настроенным проектом Chalice. Внутри есть .chalice Скрытый каталог, содержащий файлы конфигурации, A требования .txt и приложение . Есть наша первая подсказка, если вы вспомните, в нашем приложении Flask мы создали app.py Также, что является общей колбой идиомой. Но если мы посмотрим на app.py Это станет ясно:

from chalice import Chalice

app = Chalice(app_name='mychaliceapp')

@app.route('/')
def index():
    return {'hello': 'world'}

Выглядит знакомо? Они говорят, что имитация является искренней формой лести. И если я Армин Ронахер (Создатель колба), я чувствую себя довольно польщенным. И развернуть:

chalice deploy

Когда развертывание отделки, Чаша вернет URL, который теперь должен быть знаком: https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/API.

Вы догадались, есть наш старый друг, шлюз API. И проверить это:

curl https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/api

Который должен вернуться:

{"hello": "world"}

Нам даже не нужно было писать какой-либо код для этого. Это делает это бездным?

Chalice предлагает API Flask-Esque и очень предназначен для API для json Read. Он также приходит также в комплекте с хорошими интеграциями с другими услугами AWS, включая аутентификацию с AWS Cognito. Понятно, что проект ориентирован на проблему, они пытаются решить, как таковые, до тех пор, пока ваша проблема – apis json rest apit, тогда чаша может помочь вам быстро встать и работать на aws lambda. Что-нибудь еще? Вы собираетесь захотеть посмотреть на другие варианты, которые мы накрыли до сих пор.

В суммировании

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

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

Оригинал: “https://dev.to/adjohn/the-right-way-to-do-serverless-in-python-part-2-3deg”