25 свежих библиотек и проектов под Android (на февраль 2018)

25 свежих библиотек и проектов под Android (на февраль 2018)

Представляю вам список из 25 новых проектов под Android, которые, возможно, заинтересуют вас так же, как и меня. К тому же все они были опубликованы в последние три месяца.
Итак, вперёд!

1. transitioner

Transitioner это библиотека, с помощью которой можно довольно легко создавать динамические анимации между представлениями. Написана на Kotlin и поставляется под лицензией MIT, и к тому же отлично документирована.

25 свежих библиотек и проектов под Android (на февраль 2018)

Библиотека поддерживает уровень API 19 и выше. В проекте содержится пример проекта, показывающий весь имеющийся функционал.

2. FragmentRigger

Эта библиотека позволяет очень эффективно управлять фрагментами (Fragments). Её основная задача — сделать работу с фрагментами удобной и минимизировать основные издержки при работе с ними.

25 свежих библиотек и проектов под Android (на февраль 2018)

Библиотека отлично документирована, содержит пример приложения. Поставляется под лицензией MIT.

3. PRDownloader

Эта библиотека — загрузчик файлов с поддержкой приостановки загрузки.

25 свежих библиотек и проектов под Android (на февраль 2018)

Краткое описание из README:

С помощью PRDownloader можно скачивать любые типы файлов, такие как изображения, видео, pdf, apk и т.п.
Библиотека поддерживает приостановку и восстановление загрузки файла.
Может загружать файлы любых размеров.
Очень проста в использовании.
PRDownloader поддерживает всевозможные коллбэки, такие как onProgress, onCancel, onStart, onError и т.д. при скачивании. Может отслеживать состояние любой загрузки по её идентификатору.
Поддерживает отмену загрузки.
Параллельно может быть запущено любое количество запросов.
Легко кастомизируется.

Библиотека отлично документирована, содержит пример приложения. Поставляется под лицензией Apache-2.0.

4. AnimatedPieView

AnimatedPieView — новый подход в представлении круговых диаграмм для Android.

25 свежих библиотек и проектов под Android (на февраль 2018)
25 свежих библиотек и проектов под Android (на февраль 2018)

Бибилиотека поддерживает:

  • анимации при прикосновении,
  • настраиваемые промежутки между элементами,
  • описание для элементов,
  • callback для клика,
  • эффекты при клике,
  • трансформацию между круговой и кольцевой диаграммами,
  • анимацию при отрисовке диаграмм.

Имеется хорошая документация и примеры использования. Поставляется под лицензией Apache-2.0.

5. FloatWindow

С помощью этой библиотеки можно добавить “Плавающее окно” поверх всех ваших представлений. Это окно может быть и в виде Floating Action button. Из картинки всё понятно:

25 свежих библиотек и проектов под Android (на февраль 2018)

Поставляется под лицензией Apache 2.0, хорошо документирована (правда, на китайском).

6. MyLittleCanvas

Задача этой библиотеки — облегчить работу с канвой в Android. Вместо методов теперь вы можете использовать объекты.

25 свежих библиотек и проектов под Android (на февраль 2018)

С её помощью можно сделать, например, вот такое симпатичное подчёркивание у TextView, как на примере выше.
Пример в README самодостаточен и очень простой. Поставляется под лицензией Apache-2.0.

7. WindowImageView

Очень интересная библиотека, представляющая ImageView в RecyclerView. Из картинки всё понятно:

25 свежих библиотек и проектов под Android (на февраль 2018)

25 свежих библиотек и проектов под Android (на февраль 2018)

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

8. ChartView

ChartView показывает, как отрисовывать кастомные графики с помощью Canvas и ValueAnimator.

25 свежих библиотек и проектов под Android (на февраль 2018)

9. hyperlog-android

Это библиотека для логгирования, построена поверх стандартного класса Log в Android для хранения логов в базе данных и отправки их на удалённый сервер для отладки.

25 свежих библиотек и проектов под Android (на февраль 2018)

Хорошо документирована, имеется пост в блоге о её работе и пример приложения. Выложена под лиц. MIT.

10. Fairy

Fairy это небольшая утилита для отладки, позволяющая разработчикам использовать команду adb logcat для чтения Android system log на телефоне Android вместо компьютера.
Также позволяет просматривать системный журнал даже без получения root-прав.

25 свежих библиотек и проектов под Android (на февраль 2018)

Хорошо документирована и выложена под лиц. Apache-2.0, поддерживает Android API 21 и выше.

11. ExpansionPanel

Эта библиотека позволяет создавать раскрывающиеся панели (с возможностью редактирования элементов).

25 свежих библиотек и проектов под Android (на февраль 2018)

Хорошо документирована и содержит пример приложения, код выложен под лиц. Apache-2.0. Пример приложения также есть в Google Play

12. kotlin-math

Это набор API на Kotlin для более лёгкой записи математических выражений.

Поставляется под лиц. Apache-2.0.

13. TicketView

Библиотека поможет создать представление в виде билета — Ticket View. В ней 3 вида углов у TicketView: нормальный, закруглённый и зубчатый.

25 свежих библиотек и проектов под Android (на февраль 2018)

Поставляется под лиц. Apache-2.0, а пример приложения есть в репозитории на Github или в Google Play. Библиотека поддерживает уровень API 15 и выше.

14. Cipher.so

Эта библиотека поможет зашифровать важные данные в нативную библиотеку .so.

25 свежих библиотек и проектов под Android (на февраль 2018)

Как она работает? Все данные вида ключ-значение автоматически упаковываются в системную библиотеку во время компиляции. Затем эти данные могут быть получены через Java интерфейс, созданный Cipher.so.

Поставляется под лиц. Apache-2.0.

15. android-clean-architecture-mvi-boilerplate

Это форк шаблона чистой архитектуры Buffer по шаблону Model-View-Intent.

25 свежих библиотек и проектов под Android (на февраль 2018)

В слое представления использует ViewModels из Android Architecture Components Library. Кэширование построено с применением Room.

16. Android-Indefinite-Pager-Indicator

Лёгкий и легкоподключаемый индикатор страниц для RecyclerViews & ViewPagers.

25 свежих библиотек и проектов под Android (на февраль 2018)

Имеет хорошую документацию, пример приложения, множество способов кастомизации индикатора и поставляется под лиц. MIT. Миним. уровень SDK — 16.

17. daggraph

Если вы используете Dagger, возможно, вам будет интересно увидеть схему ваших зависимостей. С помощью Daggerph это очень просто сделать.

25 свежих библиотек и проектов под Android (на февраль 2018)

Документации немного, но достаточно для начала, проект выложен под лиц. Apache-2.0.

18. ToastCompat

Эта библиотека помогает отследить и пофиксить BadTokenException у компонента Toast.
Начиная с API 25, был добавлен новый параметр IBinder windowToken для Toast#handleShow() и как раз он вызывает BadTokenException. ToastCompat обходит эту проблему.

Более подробно можно почитать в README проекта на Github. Лицензия Apache-2.0.

19. RecyclerBanner

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

25 свежих библиотек и проектов под Android (на февраль 2018)

В проекте нет документации, но есть пост в блоге.

20. FancyToast-Android

С помощью этой библиотеки можно сделать вывод Toast намного симпатичнее. В ней есть множество настроек стиля вывода, в т.ч. даже стилизация прямо из кода приложения.

25 свежих библиотек и проектов под Android (на февраль 2018)

Проект отлично документирован и имеется приложение для примера. MinSDK — 19 и лицензия Apache-2.0.

21. RecyclerViewCardGallery

Эта библиотека — форк RecyclerViewCardGallery. Вместо использования ViewPager, её автор воспользовался RecyclerView для достижения эффекта карусели и свайпа для обновления.

25 свежих библиотек и проектов под Android (на февраль 2018)

В проекте есть базовая документация и пример приложения, лицензия Apache-2.0.

22. ig-lazy-module-loader

Эта библиотека позволяет загружать модули приложения по требованию, только когда они нужны. Перед её использованием необходимо скомпилировать модули в отдельные jar/dex или apk файлы.

На текущий момент библиотека поддерживает загрузку java- и android-библиотек, независимых от ресурсов android.

23. retrofit2-kotlin-coroutines-adapter

Это экспериментальный адаптер Retrofit 2 для корутин Kotlin типа Deferred. Лицензия Apache-2.0.

24. CalendarPicker

Ещё одна библиотека для выбора даты из календаря. Очень гибкая в настройках — вы можете настроить размеры и цвет у всех текстовых полей, цвет фона и названия месяцев.

25 свежих библиотек и проектов под Android (на февраль 2018)

Лицензия MIT.

25. avocado

Это утилита командной строки (подобная svgo), оптимизирующая xml файлы Android VectorDrawable (VD) и AnimatedVectorDrawable (AVD).
Лицензия MIT.

Что она делает:

avdo переписывает VectorDrawable, используя наименьшее возможное количество и , уменьшая размеры файлов и делающая их более оптимальными для парсинга и отрисовки во время исполнения. Посмотрите пример кода «до» и «после» применения утилиты в файле README.

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

По материалам «25 new Android libraries and projects to check at the beginning of 2018»

Дополненная реальность с NativeScript

Дополненная реальность с NativeScript

В связи с выходом iOS 11 мы с радостью сообщаем о готовящемся функционале дополненной реальности (AR) в NativeScript!

Последние релизы AR SDK от Apple (ARKit) и Google (ARCore) предоставили возможность разработчикам NativeScript создавать захватывающие межплатформенные AR-события. Приложение в видео выше было создано в альфа-версии нашего плагина nativescript-ar. Сегодня этот плагин использует API ARKit, доступные в iOS 11. В ближайшем будущем поддержка будет добавлена ​​для Android через API ARCore.

Вообще устройства должны работать на iOS 11 для полноценной поддержки ARKit, но из-за того, что API-интерфейсы NativeScript загружаются во время выполнения, с плагином nativescript-ar вы можете работать и на более старых версиях iOS.

iOS 11 поддерживает iPhone 6S и более новые устройства.

С ARCore на Android совсем другая история, поскольку Google ограничил поддержку ARCore для Android 8 (Oreo), работающую только на Samsung Galaxy S8 и Google Pixel. Хотя поддержка, безусловно, расширится, производители Android, как известно, медленно обновляются до последней версии Android.

Наиболее правильный способ использования AR — вначале обнаружить поверхность, затем поместить объекты на поверхность (или выше). Объекты могут быть чем угодно: от кубов и сфер до полномасштабных 3D-моделей, используя сотни тысяч полигонов. Объекты могут иметь массу, следовательно, гравитация может также влиять на них.

Ищете бесплатный репозиторий 3D-моделей для вашего следующего AR-проекта? Взгляните на turbosquid.com.

Немного кода

Цель нашего AR-плагина — исключить ненужную путаницу с платформами и предоставить чистый и понятный API. Использовать его очень просто — добавьте элемент в ваше представление и укажите события и свойства для управления его поведением:



С плагином nativescript-ar вы сможете перехватывать события и программно взаимодействовать с потоком с камеры на экране. К примеру, вы можете получить уведомление о том, в какой координатой плоскости произошло какое-то действие:


…затем присвойте событие planeTapped к вашему компоненту, чтобы добавить (в нашем примере) трехмерную модель дерева к этой конкретной точке сцены:

planeTapped(position: ARPosition): void {
this.ar.addModel({
name: "tree.dae",
position: position,
scale: 0.01,
mass: 0.0002,
onLongPress: ((model: ARNode) => {
model.remove();
})
});
}

Дополненная реальность с NativeScript

Когда это будет доступно?

Как только, так сразу 🙂

Сейчас плагин nativescript-ar активно дорабатывается. Первый релиз будет поддерживать только ARKit из-за упомянутых выше нюансов с поддержкой ARCore под Android. Однако API ARKit и ARCore относительно похожи, поэтому во время разработки мы держим в уме общую картину, чтобы сделать по-настоящему кросс-платформенное решение.

Несмотря на это, благодаря большому покрытию API в обоих SDK (и благодаря возможностям NativeScript) разработчики всегда смогут использовать неопубликованные пока API-интерфейсы платформы, даже если они не реализованы в плагине.

Здесь, в Progress, мы очень рады будущему с дополненной реальностью на мобильных устройствах и мы счастливы, что NativeScript может помочь вам с этим.

По материалам Preview of Augmented Reality in NativeScript

Вышел NativeScript 3.2

8 сентября вышел релиз 3.2 замечательного фреймворка NativeScript для построения кроссплатформенных нативных мобильных приложений под Android и iOS.

Обновить можно командой

npm install -g nativescript
Основные изменения:

  • Поддержка Xcode9 и iOS 11
  • Web Worker-ы и с Webpack
  • Огромное количество исправленных ошибок
  • Новый экспериментальный режим GC для Android

Поддержка Xcode9 и iOS 11

iOS 11 (и, возможно, новый iPhone 8?) уже в планах! И уже очень скоро она будет на каждом iOS устройстве. Но что ещё важнее — ваши приложения NativeScript будут работать на ней без проблем. Можете прямо сейчас опробовать это с релизом 3.2 — в нём появилась официальная поддержка Xcode 9 и iOS 11.

В NativeScript CLI также было сделано много усовершенствований относительно процесса сборки. Вывод при сборке теперь не настолько подробный — он выводит только необходимую информацию. Мы также используем новую опцию allowProvisioningUpdates в Xcode.

Web Worker-ы и с Webpack

Далее, теперь вы можете использовать web workers при сборке с webpack! Вы можете использовать nativescript-worker-loader для внедрения сценария web worker-ов при сборке. Загрузчик будет использован в NativeScriptWorkerPlugin. Почитайте документацию к nativescript-worker-loader, там всё это расписано более подробно.

Огромное количество исправленных ошибок

Мы исправили более 50 ошибок с релиза 3.1.0! Вот наиболее крупные:

  • Исправлено “Непредвиденное поведения при экспорте архива в iOS при использовании AdHoc или AppStore” #3020 (спасибо, Peter Staev!);
  • Представления Android по-умолчанию кэшируются при навигации вперёд. Это должно улучшить производительность, особенно при навигации назад в Android;
  • Добавлены события Blur и Focus (спасибо, Eddy!);
  • Исправления в V8 GC из-за интеграции с Vue;
  • Несколько ошибок исправлены в сценариях установки делающие их более стабильными на разных платформах и окружениях;
  • Множество исправлений для улучшения стабильности в NativeScript Core Modules и CLI.
Новый экспериментальный режим GC для Android

Если вы читали пост от Panayot Cankov о производительности вы можете вспомнить про рутину MarkReachableObjects() включающуюся при передаче V8 GC и отнимающую более 0.5 секунд (даже до 1 секунды в Angular). В основном там то, что Java-экземпляры преждевременно не собирались Java GC, в то время, как они нужны на стороне JavaScript. Мы заметили, что эта задача нужна не во всех случаях — только тогда, когда нет никакой другой ссылки на экземпляр Java, и область действия — единственное, что должно поддерживать жизнь ссылки. А код в tns-core-modules написан таким образом, что он не учитывал область видимости, что должно поддерживать ссылку на эти экземпляры Java.

Мы ввели флаг, которым вы можете отключить MarkReachableObjects. Всего лишь нужно добавить такой кусок в app/package.json:

{
"android": {
"markingMode": "none"
}
}

Но имейте в виду, что этот флаг — экспериментальный! Естественно, мы усиленно тестируем его работу и уверены, что с ним не должно быть проблем в работе tns-core-modules, однако ошибки могут быть при работе со сторонними модулями или плагинами.

Как же поступить? Вы можете включить его и посмотреть не ухудшилась ли работа вашего приложения. Здесь можно более подробно почитать про это (включая измерения производительности).

Пишите нам

Надеемся, вам понравится этот релиз и мы будем благодарны если при появлении каких-либо проблем вы опишете их на нашей странице проблем на Github! Также ознакомьтесь с планом развития NativeScript, мы периодически обновляем его с перечислением того, что уже реализовано и что будет в следующих релизах.

Удачной работы с NativeScript!

По материалам «Announcing the Release of NativeScript 3.2»

Создание сайта с GitHub авторизацией на Buffalo (Golang)

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

Проверьте сперва, что у вас установлен Buffalo и npm.

Регистрируем приложение на GitHub

Для начала нам нужно зарегистрировать приложение на GitHub. Для этого перейдите в раздел developer applications и добавьте новое OAuth приложение.

  • в Homepage URL укажите:
    http://127.0.0.1:3000
  • в Authorization callback URL укажите:
    http://127.0.0.1:3000/auth/github

Остальные поля заполните по желанию. После окончания регистрации у вас будут Client ID и Client Secret. Храните их в секрете и никогда не публикуйте!

Создаём проект

Создадим новый проект с указанием флага —skip-pop, это нужно, чтобы наш проект был создан без компонентов базы данных. В этом примере мы сконцентрируемся на авторизации и не будем касаться контента сайта. Итак, создадим проект githubauth:

buffalo new githubauth --skip-pop

Интегрируем goth в наш проект

Для авторизации мы будем использовать goth. Поддержка этого пакета включена в Buffalo и в нём есть генератор для создания базовой структуры. Чтобы добавить функционал авторизации на сайт используйте следующую команду:

buffalo g goth github

Проверка маршрутов

Начнём с actions/app.go:

// App is where all routes and middleware for buffalo
// should be defined. This is the nerve center of your
// application.
func App() *buffalo.App {
if app == nil {
app = buffalo.Automatic(buffalo.Options{
Env: ENV,
SessionName: "_githubauth_session",
Host: "http://localhost:3000",
})

app.GET(«/», HomeHandler)

app.ServeFiles(«/assets», assetsPath())
auth := app.Group(«/auth»)
auth.GET(«/{provider}», buffalo.WrapHandlerFunc(gothic.BeginAuthHandler))
auth.GET(«/{provider}/callback», AuthCallback)
}


return app
}

Генератор добавил свои маршруты (строки 15-17). Вначале была создана группа auth, а внутри неё добавлен маршрут для авторизации и ещё один для обратного вызова. Оба настроены так, чтобы можно было в дальнейшем использовать множество провайдеров. А в нашем случае в переменной {provider} корректен только github.

При работе с OAuth провайдерами им важно знать обратный адрес, на который возвращать ответ от процесса авторизации. Добавим в конфигурацию опцию Host (строка 9) для указания нашего сервера. В этом примере наш сервер будет доступен по адресу localhost:3000.

В разработке мы будем использовать следующие адреса:

http://127.0.0.1:3000/auth/github
http://127.0.0.1:3000/auth/github/callback

Проверка авторизации

Рассмотрим файл action/auth.go:

package actions

import (
«fmt»
«os»

«github.com/gobuffalo/buffalo»
«github.com/markbates/goth»
«github.com/markbates/goth/gothic»
«github.com/markbates/goth/providers/github»
)

func init() {
gothic.Store = App().SessionStore

goth.UseProviders(
github.New(os.Getenv(«GITHUB_KEY»), os.Getenv(«GITHUB_SECRET»), fmt.Sprintf(«{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}s{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}s», App().Host, «/auth/github/callback»)),
)
}


func AuthCallback(c buffalo.Context) error {
user, err := gothic.CompleteUserAuth(c.Response(), c.Request())
if err != nil {
return c.Error(401, err)
}
// Do something with the user, maybe register them/sign them in
return c.Render(200, r.JSON(user))
}

В строке 17 мы задаём Client ID и Client Secret. Генератор берёт их с помощью os.Getenv(). Соответственно, у вас должны быть заданы переменные окружения GITHUB_KEY и GITHUB_SECRET. Если вы не знаете что с ними делать, воспользуйтесь setenv.

Запустим Buffalo в режиме разработки:

buffalo dev

Перейдём по адресу авторизации и посмотрим что там:

http://127.0.0.1:3000/auth/github
Если вы авторизованы на GitHub, то вы сразу сможете авторизоваться и на нашем сайте.

Меняем scope

На данный момент мы не спрашивали никаких разрешений, но если вам необходимо знать больше информации от пользователя, задайте scope. Для GitHub эта тема хорошо документирована. Для получения электронной почты пользователя вызовите goth.UseProviders() следующим образом:

goth.UseProviders(
github.New(
os.Getenv("GITHUB_KEY"),
os.Getenv("GITHUB_SECRET"),
fmt.Sprintf("{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}s{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}s", App().Host, "/auth/github/callback"),
"user:email"),
)

При заданном scope, GitHub явно спросит пользователя, желает ли он поделиться такой информацией с вашим приложением. Поиграйтесь с этим механизмом и посмотрите как будет меняться страница авторизации.

Создаём сайт

Самое сложное позади, осталось создать сайт вокруг нашего механизма.

Структура сайта будет предельно проста:

  • Главная страница: /
  • Страница входа: /login
  • Безопасное содержимое: /secure

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

Создаём middleware

Для проверки авторизованности пользователя создадим промежуточное приложение.

// CheckAuth is the middlewar to check if a user is logged on.
func CheckAuth(next buffalo.Handler) buffalo.Handler {
return func(c buffalo.Context) error {
// Read the userID out of the session
userID := c.Session().Get("userID")
// If there is no userID redirect to the login page
if userID == nil {
err := c.Redirect(http.StatusTemporaryRedirect, "/login")
return err
}
// If not, call the next handler
err := next(c)
return err
}
}

Создаём безопасные маршруты

Сгруппируем весь безопасный контент:

// Create the secure group
secure := app.Group("/secure")
// Add the middleware CheckAuth to the group
secure.Use(CheckAuth)
// Create a simple secure handler, which renders a html file
secure.GET("/",
func(c buffalo.Context) error {
return c.Render(200, r.HTML("secure/index.html"))
})
// Create a logout action, where the userID inside the session is deleted
secure.DELETE("/logout",
func(c buffalo.Context) error {
session := c.Session()
session.Delete("userID")
session.Save()
return c.Redirect(301, "/login")
})

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

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

Хранение пользователя в сессии

После того, как GitHub перекинет пользователя на страницу обратного вызова, у нас будет вся запрошенная информация о пользователе. И нам необходимо сохранить данные входа в сессии. Изменим обработчик AuthCallback для этого:

func AuthCallback(c buffalo.Context) error {
user, err := gothic.CompleteUserAuth(c.Response(), c.Request())
if err != nil {
return c.Error(401, err)
}
session := c.Session()
session.Set("userID", user.UserID)
err = session.Save()
if err != nil {
return c.Error(401, err)
}
return c.Redirect(http.StatusMovedPermanently, "/secure")
}

В строках 6-8 user.UserID сохраняется в сессии. В строке 12 перекидываем пользователя на безопасную страницу.

Заключение

Я не буду описывать как создавать страницы в Buffalo, это есть в документации. У нас на текущий момент есть безопасный раздел, куда попадает пользователь после входа. Чтобы добавить ещё один безопасный маршрут, используйте соответствующую группу роутов.

Состояние пользователя (по userID) мы храним в сессии, а если пользователь захочет выйти, мы просто удалим его сессию.

На странице входа будет ссылка “Login with your GitHub Account”, но пакет goth поддерживает множество провайдеров (предполагаю, он поддерживает все подобные сервисы, а в его примерах использования вы найдёте все поддерживаемые службы).

Если вы захотите добавить авторизацию через Twitter, просто добавьте его в конфигурацию. Здесь подробно об этом.

buffalo g goth twitter github

С помощью scope вы можете запрашивать любую информацию о пользователе (такую, как почта, аватар, телефон и т.п.), мы описали это выше.

А если вы не хотите заниматься этим, воспользуйтесь сервисом Auth0, который сам всё сделает за вас.

Пример вы можете взять здесь. Внимательно ознакомьтесь с инструкцией по установке.

Источник: «Buffalo Tutorial: Create a site with GitHub Auth»

Go дайджест. События, статьи, интересные проекты из мира Go (19 — 26 мая 2017)

Всем привет!

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

Новости, События

Релиз Go 1.8.3 [EN]
— Релиз Hugo 0.21 [EN]
The State of Go. Состояние вокруг Go на май 2017 [EN]
Вышла версия 0.6 скрипта для установки/обновления Go update-golang

Статьи

— Распределенный поиск Трампа
— [Перевод] Производительность I/O бэкэнда: Node vs. PHP vs. Java vs. Go.
— А пусть тесты сами себя и поддерживают.
— Передача типа map в функцию.
Гайд по структурам в Go. [EN]
Миграция с MySQL на TiDB — обработка десятков миллионов строк данных в день. [EN]
SQL-инъекции и как их избежать в Go? [EN]
Отладка дампов Go. [EN]
— Работа с колонками типа datetime/date баз данных в go. [EN]

Подкасты

— GolangShow, Выпуск 101. «Хороший Go»
Go Time #47. «Docker, Moby, and Containers with Solomon Hykes». [EN]

Интересные проекты

Algernon — Web server со встроенной поддержкой HTTP/2, Lua, Markdown, Pongo2, Amber, Sass(SCSS), GCSS, JSX, BoltDB, Redis, PostgreSQL, MariaDB/MySQL, ограничениями скорости, плагинами, с пользователями и системой прав доступа. Чистый Go, никаких внешних зависимостей.
веб-сайты на Go с открытыми исходниками
aah framework — масштабируемый, производительный Web-framework быстрой разработки для Go
slacker — библиотека для создания Slack-ботов

Видео

GopherFest 2017. [EN]

Как создать бота для Facebook Messenger на Python Flask

Как создать бота для Facebook Messenger на Python Flask
Сейчас каждый строит своего бота и сегодня мы расскажем как написать бота на Python/Flask. Исходники можно взять здесь.

Мы будем использовать следующие технологии:

  • На бэкенде: Flask
  • Безопасное туннелирование к localhost: Ngrok
  • Платформа обработки естественного языка: API AI
  • Развёртываем в Facebook Messenger
  • Python wrapper для OpenWeatherMap API для погоды


Мы сделаем следующую штуку: запрашиваем у чат-бота погоду в заданном месте, а он отвечает погодной сводкой.

Пример:

Вопрос: What is the current weather of New Delhi? (Какая погода в Нью-Дели?)
Ответ: Current weather report of New Delhi : max temp: 42.0 min temp: 40.0 current temp: 40.95 wind speed :2.6 humidity 20{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a} (Погода в Нью-Дели: макс. темп: 42.0 мин. темп: 40.0 текущая темп: 40.95 скорость ветра :2.6 влажность 20{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a})

Как создать бота для Facebook Messenger на Python Flask

1. Настраиваем API AI

API AI это платформа для построения приложений, основанных на общении. Зарегистрируйтесь там и создайте агента для доступа к тестовой консоли. Перейдите в настройки агента и получите Client Access Token.

Как создать бота для Facebook Messenger на Python Flask

Создаём intent

Intent (намерение) это связка пользовательского запроса и желаемого ответа. Мы добавим его со следующим пользовательским запросом: «What’s the weather in Singapore?» («Какова погода в Сингапуре?»)

Как создать бота для Facebook Messenger на Python Flask
где Singapore задан как сущность типа @sys.geo-city. Т.е. этот параметр принимает любые запросы в диалоге для построения корректного ответа.

И мы добавим такой ответ на этот запрос: «Current weather report of $geo-city :»

Как создать бота для Facebook Messenger на Python Flask

Python клиент к API AI

Мы будем использовать python SDK API AI для обработки естественного языка.

2. Настраиваем Open Weather Map

У Open Weather Map есть хороший API для доступа к погодным условиям в любой точке планеты. И также есть отличная обёртка на python для этого API. Регистрируйтесь на OWM и получайте свой API ключ для доступа к API погоды.

owm = pyowm.OWM('your_open_weather_map_api_key') # You MUST provide a valid API key

forecast = owm.daily_forecast(input_city)

observation = owm.weather_at_place(input_city)
w = observation.get_weather()
print(w)
print(w.get_wind())
print(w.get_humidity())
max_temp = str(w.get_temperature('celsius')['temp_max'])
min_temp = str(w.get_temperature('celsius')['temp_min'])
current_temp = str(w.get_temperature('celsius')['temp'])
wind_speed = str(w.get_wind()['speed'])
humidity = str(w.get_humidity())

Если же у вас есть PRO-подписка, запрос будет немного другим:

owm = pyowm.OWM(API_key='your-API-key', subscription_type='pro')

3. Создаём Flask Server

import apiai
Добавляем все токены и верифицируем их:

CLIENT_ACCESS_TOKEN = 'your_client_access_token_from_api_ai'
PAGE_ACCESS_TOKEN = 'your_facebook_page_access_token'
VERIFY_TOKEN = 'verification_token_for_facebook_chatbot_using_python'

ai = apiai.ApiAI(CLIENT_ACCESS_TOKEN)
Теперь нужно отправить запрос к Facebook webhook от приложения с проверкой корректности токена, заданного в приложении facebook:

@app.route('/', methods=['GET'])
def handle_verification():
if (request.args.get('hub.verify_token', '') == VERIFY_TOKEN):
print("Verified")
return request.args.get('hub.challenge', '')
else:
print("Wrong token")
return "Error, wrong validation token"

Приложение будет обрабатывать все сообщения от facebook messenger

@app.route('/', methods=['POST'])
def handle_message():
'''
Handle messages sent by facebook messenger to the applicaiton
'''
data = request.get_json()

if data["object"] == "page":
for entry in data["entry"]:
for messaging_event in entry["messaging"]:
if messaging_event.get("message"):

sender_id = messaging_event["sender"]["id"]
recipient_id = messaging_event["recipient"]["id"]
message_text = messaging_event["message"]["text"]
send_message_response(sender_id, parse_natural_text(message_text))

return "ok"
Вызовем facebook Graph API с помощью библиотеки python requests для отправки сообщения пользователю facebook

def send_message(sender_id, message_text):
'''
Sending response back to the user using facebook graph API
'''
r = requests.post("https://graph.facebook.com/v2.6/me/messages",

params={"access_token": PAGE_ACCESS_TOKEN},

headers={"Content-Type": "application/json"},

data=json.dumps({
"recipient": {"id": sender_id},
"message": {"text": message_text}
}))

Используем API AI для разбора сообщения от пользователя, получим ответ боту от API AI. Затем получаем погодные данные от open weather map и добавляем их к ответу бота

def parse_user_text(user_text):

'''
Send the message to API AI which invokes an intent
and sends the response accordingly
The bot response is appened with weaher data fetched from
open weather map client
'''

request = ai.text_request()
request.query = user_text

response = json.loads(request.getresponse().read().decode('utf-8'))
responseStatus = response['status']['code']
if (responseStatus == 200):
print("Bot response", response['result']['fulfillment']['speech'])

weather_report = ''

input_city = response['result']['parameters']['geo-city']

#Fetching weather data
owm = pyowm.OWM('edd197717da7951b85f8f6936fc27b13') # You MUST provide a valid API key

forecast = owm.daily_forecast(input_city)

observation = owm.weather_at_place(input_city)
w = observation.get_weather()
print(w)
print(w.get_wind())
print(w.get_humidity())
max_temp = str(w.get_temperature('celsius')['temp_max'])
min_temp = str(w.get_temperature('celsius')['temp_min'])
current_temp = str(w.get_temperature('celsius')['temp'])
wind_speed = str(w.get_wind()['speed'])
humidity = str(w.get_humidity())
weather_report = ' max temp: ' + max_temp + ' min temp: ' + min_temp + ' current temp: ' + current_temp + ' wind speed :' + wind_speed + ' humidity ' + humidity + '{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}'
print("Weather report ", weather_report)
return (response['result']['fulfillment']['speech'] + weather_report)
else:
return ("Please try again")

def send_message_response(sender_id, message_text):
sentenceDelimiter = ". "
messages = message_text.split(sentenceDelimiter)

for message in messages:
send_message(sender_id, message)

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

Активируйте виртуальную среду, установите необходимые пакеты

pip install -r requirements.txt
Запустите скрипт

python fb-chatbot.py

Настраиваем теннелирование к localhost

Для вывода локального сервера в интернет мы воспользуемся утилитой ngrok, с помощью которой к нему можно будет достучаться через webhook от приложения facebook

sudo apt-get update
sudo apt-get install ngrok-client

Запустим клиента

./ngrok http -bind-tls=true 5000
Помните, что secure callback URL (https) нужен для верификации.

Настраиваем facebook messenger

Создайте страницу facebook и приложение facebook. Добавьте Webhook к приложению.

Как создать бота для Facebook Messenger на Python Flask
Получите ID приложения и обновите его в скрипте.

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

Как создать бота для Facebook Messenger на Python Flask
Включите интеграцию webhook с callback URL и верифицируйте token

Как создать бота для Facebook Messenger на Python Flask
Задайте события в подписке на странице

Как создать бота для Facebook Messenger на Python Flask
Перезапустите сервер и чатбот готов. Также Facebook предоставляет дополнительные элементы пользовательского интерфейса, потестировать их можно здесь.

По материалам «How to Create a Facebook Messenger Bot with Python Flask»

Деплоим приложение Flask на AWS Elastic Beanstalk

Деплоим приложение Flask на AWS Elastic Beanstalk
Сегодня мы рассмотрим пример развёртывания приложения Flask в среде Elastic Beanstalk с Python 2.7. Основным инструментом у нас будет

EB CLI

, но вы так же можете использовать консоль управления AWS для загрузки ZIP архива с проектом.

Для использования любого из сервисов AWS вам необходимо иметь учётную запись, здесь подробнее о ней.
Также убе­ди­тесь, что у вас уста­нов­лен Python 2.7, pip, virtualenv (ес­ли нет, уста­но­ви­те его ко­ман­дой «pip install virtualenv»), awsebcli (pip install awsebcli).

Настройка виртуального окружения

Создадим виртуальное окружение Python с помощью virtualenv и в ней установим Flask с его зависимостями. Используя виртуальное окружение, вы точно будете знать, что только необходимые библиотеки будут установлены затем в EC2 при развёртывании приложения.

1. Создаём окружение eb-virt:

~$ virtualenv ~/eb-virt

2. Активируем:

~$ source ~/eb-virt/bin/activate
(eb-virt) ~$

Вы должны увидеть (eb-virt) в начале командной строки, если активация прошла успешно.

3. Установим Flask:

(eb-virt)~$ pip install flask==0.10.1
4. Проверка установки:

(eb-virt)~$ pip freeze
Flask==0.10.1
itsdangerous==0.24
Jinja2==2.7.3
MarkupSafe==0.23
Werkzeug==0.10.1

Эта команда выведен список всех установленных в виртуальном окружении пакетов, а позже мы с её помощью составим список пакетов для установки в Elastic Beanstalk.

Создаём приложение Flask

Мы создадим несложный RESTful веб-сервис для Elastic Beanstalk.

1. Активируйте окружение:

~$ source ~/eb-virt/bin/activate
2. Создайте папку проекта и перейдите в неё:

(eb-virt) ~$ mkdir eb-flask
(eb-virt) ~$ cd eb-flask

3. Создайте файл application.py в этой папке с содержимым:

from flask import Flask

# print a nice greeting.
def say_hello(username = "World"):
return '

Hello {33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}s!

\n' {33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a} username

# some bits of text for the page.
header_text = '''
\n EB Flask Test \n'''
instructions = '''

Hint: This is a RESTful web service! Append a username
to the URL (for example: /Thelonious) to say hello to someone specific.

\n'''
home_link = '

Back

\n'
footer_text = '\n'

# EB looks for an 'application' callable by default.
application = Flask(__name__)

# add a rule for the index page.
application.add_url_rule('/', 'index', (lambda: header_text +
say_hello() + instructions + footer_text))

# add a rule when the page is accessed with a name appended to the site
# URL.
application.add_url_rule('/', 'hello', (lambda username:
header_text + say_hello(username) + home_link + footer_text))

# run the app.
if __name__ == "__main__":
# Setting debug to True enables debug output. This line should be
# removed before deploying a production app.
application.debug = True
application.run()

В этом примере на страничку выводится настраиваемое приветствие, принимающее параметром имя пользователя.

Добавив application.debug = True перед запуском приложения, мы включили режим отладки и увидим в консоли появляющиеся ошибки. Но не забудьте выключить отладку когда приложение будет готово и полноценно работать.

Если мы используем имя файла application.py и вызываемый объект application, Elastic Beanstalk легко найдёт код нашего приложения.

4. Запускаем application.py с помощью Python:

(eb-virt) ~/eb-flask$ python application.py
Flask запустит веб-сервер и выведет URL для доступа к приложению. Например:

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat

5. Откройте этот URL в браузере и увидите главную страницу нашего приложения:

Деплоим приложение Flask на AWS Elastic Beanstalk
6. Вывод от приложения можно увидеть в журнале сервера, ошибки так же выводятся в него. Остановить сервер и вернуться в виртуальное окружение можно командой Ctrl-C.

Перед тем, как загрузить приложение в Elastic Beanstalk, убедитесь, что оно работает локально без ошибок.

Настраиваем Flask приложение для Elastic Beanstalk

1. Активируйте окружение:

~$ source ~/eb-virt/bin/activate
2. Запустите pip freeze и сохраните вывод в файл requirements.txt:

(eb-virt) ~/eb-flask$ pip freeze > requirements.txt
Elastic Beanstalk использует requirements.txt для определения списка пакетов к установке в экземпляре EC2 при запуске вашего приложения.

3. Деактивируйте виртуальное окружение командой deactivate:

(eb-virt) ~/eb-flask$ deactivate
Активируйте его в следующий раз, если вам понадобится запустить приложение локально или добавить в него какие-либо дополнительные библиотеки.

Деплоим приложение с помощью EB CLI

Мы сделали всё необходимое для загрузки приложения в Elastic Beanstalk. Иерархия файлов приложения выглядит так:

~/eb-flask/
|-- application.py
`-- requirements.txt

Осталось создать необходимое окружение и загрузить его на сервер.

1. Инициализируем репозиторий EB CLI командой eb init:

~/eb-flask$ eb init -p python2.7 flask-tutorial
Application flask-tutorial has been created.

Эта команда создаст приложение flask-tutorial и настроит необходимое окружение с Python 2.7.

2. (По желанию) Выполните команду eb init ещё раз для генерации ключа, чтобы была возможность подключаться к EC2 по SSH:

~/eb-flask$ eb init
Do you want to set up SSH for your instances?
(y/n): y
Select a keypair.
1) my-keypair
2) [ Create new KeyPair ]

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

3. Создаём окружение и деплоим приложение:

~/eb-flask$ eb create flask-env

Если вы видите ошибку «service role required», запустите команду eb create и EB CLI создаст нужную роль.

Эта команда создаст окружение Elastic Beanstalk с именем flask-env. На создание окружения требуется обычно около 5 минут.

4. После выполнения предыдущей команды откройте ваш сайт:

~/eb-flask$ eb open
Откроется веб-браузер с адресом, присвоенным вашему приложению:

Деплоим приложение Flask на AWS Elastic Beanstalk

Дальнейшие шаги

В целях экономии ресурсов AWS, можно выключать окружение Elastic Beanstalk:

~/eb-flask$ eb terminate flask-env
При выключении ничего не удаляется и вы можете запустить его в любой момент.

А для удаления проекта и виртуального окружения с локального диска воспользуйтесь командами:

~$ rm -rf ~/eb-virt
~$ rm -rf ~/eb-flask

Источник: «Deploying a Flask Application to AWS Elastic Beanstalk»

Создаём свой пакет Python

Создаём свой пакет Python

Повторное использование кода — очень полезная штука. Вы экономите время при написание одних и тех же кусков кода, и даже в одном проекте у вас сохраняется модульная структура приложения, что позволяет поддерживать в актуальном состоянии каждый модуль отдельно от других. И в python довольно легко создать структуру приложения так, чтобы было легко его оформить в пакет. Этот гайд поможет вам научиться создавать такие пакеты с нуля так, чтобы другие люди могли воспользоваться им в своих приложениях.

Структура пакета

Файл с расширением ‘.py’ — это модуль. Вы можете создать в нём классы, функции и переменные с таким же именем, как у файла. А если в папку положить несколько модулей и создать файл ‘__init__.py’, вы создадите тем самым пакет с именем как у папки. Вот примерная файловая иерархия обычного пакета:

Создаём свой пакет Python
Сборка пакета

Теперь когда мы знаем структуру пакета, поговорим про его сборку. Самое важное здесь — конфигурационный файл ‘setup.py’. Основной смысл в нём — хранение метаданных о пакете. Вот пример такого файла:


from setuptools import setup, find_packages

setup(name='funniest',
      version='0.1',
      description='The funniest joke in the world',
      long_description='Really, the funniest around.',
      classifiers=[
        'Development Status :: 3 - Alpha',
        'License :: OSI Approved :: MIT License',
        'Programming Language :: Python :: 2.7',
        'Topic :: Text Processing :: Linguistic',
      ],
      keywords='funniest joke comedy flying circus',
      url='http://github.com/storborg/funniest',
      author='Flying Circus',
      author_email='flyingcircus@example.com',
      license='MIT',
      packages=find_packages(),
      install_requires=[
          'markdown',
      ],
      include_package_data=True,
      zip_safe=False)

Более подробно об этом файле можно прочитать в документации.

Указываем зависимости

Для того, чтобы с пакетом можно было работать сразу после установки, вы должны указать в его конфигурации, от каких пакетов он зависит, чтобы они были сразу же установлены. Нужно просто вставить ‘install_requires=[…]’ в функцию setup. Можно также задать версию зависимости:

install_requires=[‘A==1.0’, ‘B>=1,<2’]

Эти зависимости — общедоступные пакеты, которые можно установить с помощью утилиты pip. Но если ваши зависимости не перечислены в каталоге pypi, укажите их так:

dependency_links=[‘http://github.com/user/repo/tarball/master#egg=package-1.0']
Дополнительные файлы

Иногда бывает необходимость вложить в пакет другие типы файлов. Для этого:

  1. Задайте ‘include_package_data=True’
  2. Создайте файл MANIFEST.in в папке с setup.py
  3. Добавьте путь до файла в MANIFEST как ‘include /path/to/test.json’, путь при этом относительный. Также можно использовать поисковый шаблон типа ‘*.json’.
Сборка

Теперь у нас всё готово, приступаем к сборке пакета. Это значит, что мы создадим дистрибутив исходного кода (напр., tar.gz) или бинарный файл (напр., wheel). Это очень просто.

python setup.py sdist bdist_wheel

В результате у нас в папке ‘./dist’ появятся оба формата. при этом имя дистрибутива будет присвоено исходя из имени пакета и его версии.

Распространение пакета

Поздравляю, вы создали замечательный пакет! Теперь необходимо выложить его для общего доступа. Мы загрузим его на Pypi, поэтому в будущем можно будет его установить командой ‘pip install’.

Для начала создайте учётную запись на сайте pypi.

Затем выполните

twine upload dist/*

При этом файлы из папки ‘dist/’ выгрузятся в каталог pypi. Также вы можете явно указать только определённый файл для выгрузки. Twine это специальная утилита для работы с pypi. При первой загрузке пакета она зарегистрирует пакет в pypi.

Работа с пакетом

Теперь ваш пакет опубликован в pypi. Для его установки достаточно набрать ‘pip install my_package’, а затем в коде ‘import my_package’.

При локальной разработке пакета для его тестирования добавьте путь к нему в $PYTHONPATH. Но если вы не хотите трогать переменные окружения, установите его командой ‘pip install -e .’ из папки с пакетом.

По материалам «A Simple Guide for Python Packaging»

Go дайджест. События, статьи, интересные проекты из мира Go (1 — 12 мая 2017)

Всем привет!

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

Новости, События

Gobot 1.5 [EN]
Релиз 3.1.0 веб-фреймворка echo [EN]

Статьи

— Разработчик высокопроизводительного сервера распределённых блокировок Taooka делится тонкостями разработки API клиентской библиотеки на Go.
— Глубинное обучение с нуля в Go — Часть 1: графы
Используем кодогенерацию, чтобы выжить без дженериков в Go [EN]
Обработка ошибок в Go [EN]
CockroachDB 1.0: База данных SQL на Go [EN]
Если map не ссылочная переменная, то что же это? [EN]
Разработка приложения с каналами и горутинами [EN]
— Несколько полезных советов Go-разработчикам [EN]
— Анонимизация изображений на Go и Machine Box [EN]
Создаём свой отладчик для Golang (часть 1) [EN]
Опыт использования Go в продакшн [EN]
Хорошие примеры concurrency в Go [EN]
Небольшая заметка о работе со строками в Go [EN]
— Про преимущества []byte перед interface{} [EN]
Статья про создание современного веб-приложения на Go [EN]

Подкасты

— GolangShow выпуск 099: По ссылке или нет?
— Go time #46: Marc-Antoine Ruel рассказывает о работе с железом в Go, написании драйверов на Go и об интересных проектах [EN]

Интересные проекты

Официальная имплементация протокола Ethereum на Go
Система мониторинга уровня enterprise
go-astilectron — создание декстопных программ на Go + Electron
Интересный опенсорсный сервис ссылок (пока в бете) на Go c удобным API и расширением для Chrome.
Notable — заметочное web приложение на Go

Видео

— Лекции Техносферы: Программирование на Go
Введение в Ponzu CMS [EN]
О разработке структур данных в Go [EN]

Подписывайтесь на телеграмм-канал «Потрясающий Go»!

Развёртывание приложения Django в AWS Elastic Beanstalk

Развёртывание приложения Django в AWS Elastic Beanstalk
Сегодня мы рассмотрим небольшой пример развёртывания Django приложения в AWS Elastic Beanstalk (с Postgres).

Убедитесь, что у вас установлен Python 2.7, pip, virtualenv (если нет, установите его командой «pip install virtualenv»), awsebcli (pip install awsebcli) и есть учётная запись AWS. Вы можете зарегистрировать бесплатную учётку, если ещё не сделали этого ранее.

1. Создание базы данных и пользователя

Установим postgres в Ubuntu:

sudo apt-get update
sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib

После установки Postgres будет создан системный пользователь postgres, с помощью которого мы будем выполнять все действия с базой данных. Переключимся на него:

sudo su - postgres
Теперь мы работаем под postgres, далее мы войдём в PostgreSQL с помощью утилиты psql:

psql
CREATE DATABASE myproject;
CREATE USER myprojectuser WITH PASSWORD 'password';

Дадим пользователю myprojectuser полные права для работы с этой базой:

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

2. Настроим virtualenv и создадим проект Django

Создадим виртуальную среду и активируем её:

virtualenv ~/eb-venv
source ~/eb-venv/bin/activate

Установим в неё Django:

pip install django==1.11
Для проверки установленной django откроем консоль python и введём:

import django
django.VERSION

Если django установлен корректно, команда выведет версию установленного фреймворка (например, 1.11), иначе будет выведена ошибка.

Создадим проект Django:

~$ django-admin startproject ebdjango
Будет создан проект со следующей структурой:

~/ebdjango
|-- ebdjango
| |-- __init__.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
`-- manage.py

Теперь нужно проверить, что всё работает корректно. Для запуска Django-сервера локально, нужно добавить localhost или 127.0.0.1 в настройку ALLOWED_HOSTS в файле ~/ebdjango/ebdjango/settings.py. Отредактируем этот файл:

ALLOWED_HOSTS = ['localhost', '127.0.0.1', '.elasticbeanstalk.com']
(eb-venv) ~$ cd ebdjango
(eb-venv) ~/ebdjango$ python manage.py runserver
Готово. Откройте http://127.0.0.1:8000/ в браузере.

3. Настройка базы данных, миграции

(eb-venv) ~/ebdjango$ pip install django psycopg2
Откроем файл ~/ebdjango/ebdjango/settings.py, в нём будет секция DATABASES:

...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
...

Мы сменим движок базы данных с sqlite3 на postgresql_psycopg2 и добавим данные пользователя для подключения к ней и localhost как адрес сервера. Порт оставим пустым, чтобы было выбрано значение по-умолчанию.

...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
...

Запустим миграции базы данных для создания её структуры:

(eb-venv) ~/ebdjango$ python manage.py makemigrations
(eb-venv) ~/ebdjango$ python manage.py migrate

Далее создадим администратора:

(eb-venv) python manage.py createsuperuser

4. Конфигурационный файл миграции БД

Создадим конфигурационный файл ~/ebdjango/.ebextensions/db-migrate.config со следующим содержимым:

container_commands:
01_migrate:
command: "django-admin.py migrate"
leader_only: true
option_settings:
aws:elasticbeanstalk:application:environment:
DJANGO_SETTINGS_MODULE: ebdjango.settings

Этот файл запустит команду «django-admin.py migrate» во время развёртывания, прямо перед запуском приложения. И так как он выполнится до запуска приложения, вы должны явно прописать значение переменной DJANGO_SETTINGS_MODULE (обычно за это отвечает wsgi.py во время запуска). Указав leader_only: true, процесс выполнится только один раз, это важно при развёртывании нескольких экземпляров.

5. Настраиваем сайт для Elastic Beanstalk

Активируем виртуальную среду:

~/ebdjango$ source ~/eb-venv/bin/activate
Запускаем pip freeze и сохраняем вывод в файл requirements.txt:

(eb-venv) ~/ebdjango$ pip freeze > requirements.txt
Создадим папку .ebextensions

(eb-venv) ~/ebdjango$ mkdir .ebextensions
и в ней создадим файл django.config со следующим содержимым:

option_settings:
aws:elasticbeanstalk:container:python:
WSGIPath: ebdjango/wsgi.py
aws:elasticbeanstalk:container:python:staticfiles:
"/static": "static/"
container_commands:
01_collectstatic:
command: "python manage.py collectstatic --noinput"
leader_only: true

В переменной WSGIPath хранится путь до сценария WSGI, который Elastic Beanstalk использует для запуска приложения.

6. Создаём среду и развёртываем приложение Django

Создайте пользователя IAM здесь (если не сделали этого ранее). Нам понадобятся aws-access-id и aws-secret-key в дальнейшем.

Инициализируем репозиторий EB CLI командой eb init:

~/ebdjango$ eb init -p python2.7 django-tutorial
Запустим eb init ещё раз для настройки ключевой информации, необходимой для подключения к EC2 по SSH:

~/ebdjango$ eb init

Деплоим приложение:

~/ebdjango$ eb create django-env
После деплоя откроем наш сайт:

~/ebdjango$ eb open
Проверьте, что папка ~/ebdjango выглядит так:

~/ebdjango
|-- ebdjango
| |-- __init__.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
|-- manage.py
|-- requirements.txt
|-- .ebextensions
| |-- db-migrate.config
| `-- django.config
`-- .elasticbeanstalk

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

~/ebdjango$ eb deploy
Если у вас будет такая ошибка:

django.db.utils.OperationalError: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432?

это просто говорит о том, что у нас не настроен postgresql на сервере, займёмся этим сейчас.

7. Настройка базы данных RDS Postgres

Откроем страницу конфигурации Elastic Beanstalk командой

~/ebdjango$ eb console
Идём в раздел Configuration, прокручиваем вниз и нажимаем «Create a new RDS instance». Вводим свои данные и нажимаем Apply. Через пару минут все будет готово.

Развёртывание приложения Django в AWS Elastic Beanstalk
Отредактируем параметр DATABASES в settings.py:

...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ['RDS_DB_NAME'],
'USER': os.environ['RDS_USERNAME'],
'PASSWORD': os.environ['RDS_PASSWORD'],
'HOST': os.environ['RDS_HOSTNAME'],
'PORT': os.environ['RDS_PORT'],
}
}
...

Добавим файл local_settings.py в одну папку с файлом settings.py:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}

И добавим это в settings.py:

if os.environ.get('ENVIRONMENT') == "PROD":
print "Running on Production Environment settings"
else:
from local_settings import *
print "Running on Local Environment settings"

И, наконец, установим значение этого параметра:

~/ebdjango$ eb setenv ENVIRONMENT=PROD
Так мы отделим локальные настройки для разработки от настроек сервера.

Задеплоим изменения:

~/ebdjango$ eb deploy
Если у вас появятся какие-то ошибки, здесь описано как посмотреть логи в EC2.

Ссылки

По материалам «How to deploy a Django app on AWS (with Elastic Beanstalk)»