#### Планирование
Для демонстрации особенностей написания и развертывания приложений в Amvera,
создадим простое приложение на языке программирования Python
с использованием фреймворка Flask. Это будет API для TODO-заметок.
Каждая заметка будет определяться следующим образом:
```
{
"text": "Купить молоко",
"done": true
}
```
Все заметки будут храниться массивом в файле формата JSON.
Определим API следующим образом.
- `GET /todo` получает список всех TODO.
- `GET /todo/<id>` получает TODO с заданным id (индексом в массиве).
- `POST /todo` добавляет новую TODO в конец списка.
- `PUT /todo/<id>` заменяет TODO с заданным id.
#### Реализация
Для начала напишем само приложение.
Так как наше приложение использует Flask, создадим файл `requirements.txt`:
```
Flask==2.2.2
Flask-CORS==3.0.10
```
Напишем код приложения, работающий локально, в файле `app.py`:
```
import json
from flask import Flask, request, abort
from flask_cors import CORS
FILENAME = "todo.json"
def get_data():
try:
with open(FILENAME, "r", encoding="utf-8") as f:
return json.load(f)
except FileNotFoundError:
return []
def save_data(data):
with open(FILENAME, "w", encoding="utf-8") as f:
json.dump(data, f)
app = Flask(__name__)
cors = CORS(app)
@app.route("/")
def index():
return "TODO App"
@app.route("/todo")
def get_all_todo():
return get_data()
@app.route("/todo/<int:id>")
def get_single_todo(id):
data = get_data()
if id < 0 or id >= len(data):
abort(404)
return data[id]
@app.route("/todo", methods=["POST"])
def add_new_todo():
new_todo = request.json
if new_todo is None:
abort(400)
data = get_data()
data.append(new_todo)
save_data(data)
return "OK", 201
@app.route("/todo/<int:id>", methods=["PUT"])
def update_todo(id):
data = get_data()
if id < 0 or id >= len(data):
abort(404)
updated_todo = request.json
if updated_todo is None:
abort(400)
data[id] = updated_todo
save_data(data)
return "OK"
if __name__ == "__main__":
app.run(port=8080)
```
Установим зависимости:
```
pip install -r requirements.txt
```
Запустим приложение:
```
python app.py
```
Убедимся в его работоспособности при помощи Postman.
#### Подготовка приложения для Amvera
Подготовим приложение для окружения Amvera. Напишем `amvera.yml`.
```
meta:
environment: python
toolchain:
name: pip
run:
command: gunicorn --bind 0.0.0.0:5000 app:app
containerPort: 5000
```
Так как для развертывания нашего приложения мы используем gunicorn, добавим его в `requirements.txt`:
```
Flask==2.2.2
Flask-CORS==3.0.10
gunicorn==20.1.0
```
Осталось решить проблему с сохранением файла с TODO в /data.
Добавим `import os` в начало файла `app.py`, а также изменим объявление
переменной `FILENAME`:
```
FILENAME = "/data/todo.json" if "AMVERA" in os.environ else "todo.json"
```
Теперь начало файла `app.py` выглядит так:
```
import os
import json
from flask import Flask, request, abort
from flask_cors import CORS
FILENAME = "/data/todo.json" if "AMVERA" in os.environ else "todo.json"
def get_data():
# ... остаток файла
```
Инициализируем репозиторий git:
```
git init
```
Добавим созданные нами файлы в индекс:
```
git add app.py requirements.txt amvera.yml
```
Зафиксируем изменения:
```
git commit -m "TODO App"
```
#### Создание проекта в Amvera
Теперь нужно создать проект в Amvera. Откроем страницу
[https://cloud.amvera.ru/projects](https://cloud.amvera.ru/projects)
и нажмите кнопку "Создать". Укажите параметры как на изображении:
Перейдем на страницу проекта: [https://cloud.amvera.ru/projects/todo-app](https://cloud.amvera.ru/projects/todo-app).
Там нас интересуют команды для привязки проекта к существующему репозиторию:
```
git remote add amvera https://git.amvera.ru/<имя-пользователя>/todo-app
git push amvera master
```
После этого начнется сборка и развертывание проекта.
Дождитесь появления статуса "Успешно развернуто":
#### Проверка работоспособности
Снова воспользуемся Postman для отправки запросов.
Для проверки сохранности данных после перезагрузки, перезапустим сервис.
После завершения перезапуска отправим запрос Постманом для проверки наличия TODO заметок. Если они есть, значит мы все сделали правильно.
Поздравляем, вы успешно создали свое первое приложение на Amvera!