Быстрый старт

Планирование

Для демонстрации особенностей написания и развертывания приложений в Amvera, создадим простое приложение на языке программирования Python с использованием фреймворка Flask. Это будет API для TODO-заметок.

Если вы не знакомы с принципом работы с Git, рекомендуем ознакомится со статьей. Она позволит вам понять, как создавать Git-репозиторий и вносить в него изменения.

Каждая заметка будет определяться следующим образом:

{
  "text": "Купить молоко",
  "done": true
}

Все заметки будут храниться массивом в файле формата JSON.

Определим API следующим образом.

Реализация

Для начала напишем само приложение.

Так как наше приложение использует Flask, создадим файл requirements.txt:

Flask==2.2.2
Flask-CORS==3.0.10
gunicorn==20.1.0

Напишем код приложения, работающий локально, в файле 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.

Написать yaml файл можно как самостоятельно, используя инструкцию ниже, так и воспользоваться нашим генератором yaml, перейдя по ссылке.

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/todo-app. Там нас интересуют команды для привязки проекта к существующему репозиторию:

git remote add amvera https://git.amvera.ru/<имя-пользователя>/todo-app
git push amvera master

После этого начнется сборка и развертывание проекта. Дождитесь появления статуса "Успешно развернуто".

Проверка работоспособности

Снова воспользуемся Postman для отправки запросов.

Для проверки сохранности данных после перезагрузки, перезапустим сервис кнопкой в интерфейсе.

После завершения перезапуска отправим запрос Постманом для проверки наличия TODO заметок. Если они есть, значит мы все сделали правильно.

Если что-то не работает, рекомендуем ознакомиться с логами Сборки и Приложения. Если логи пишутся в print (при использовании Python), для их отображения надо выставить переменную окружения PYTHONUNBUFFERED в 1.

Дополнительно (в вашем проекте), вам могут потребоваться библиотеки, которые не устанавливаются через pip.

Поздравляем, вы успешно создали свое первое приложение в Amvera!


Revision #15
Created 27 October 2022 10:44:11 by Admin
Updated 14 February 2024 06:32:52 by Admin