Как стать автором
Обновить
1492.51
Timeweb Cloud
То самое облако

Быстрый интерфейс, быстрый деплой

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров5K


Салют! Не так давно создатели знаменитого pydantic выпустили новый фреймворк — FastUI, который позволяет создавать пользовательские интерфейсы с помощью декларативного кода на Python. В этой статье рассмотрим создание простого приложения и деплой его в Cloud Apps.

Обзор


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

Реализовано это таким образом, что FastUI инкапсулирует описание компонентов интерфейса и в виде классов, затем запускается простое React приложение, которое обращается к эндпоинтам за данными и компонентами.

Пример


Для примера давайте напишем простое приложение, предоставляющее информацию о городах из списка с возможностью пагинации.

Данные для экспериментов любезно предоставили создатели фреймворка. Для начала опишем pydantic модель и функцию для чтения данных.

from pydantic import BaseModel, Field, TypeAdapter
import json
from pathlib import Path

class City(BaseModel):
    id: int
    city: str = Field(title="Name")
    city_ascii: str = Field(title="City Ascii")
    lat: float = Field(title="Latitude")
    lng: float = Field(title="Longitude")
    country: str = Field(title="Country")
    iso2: str = Field(title="ISO2")
    iso3: str = Field(title="ISO3")
    admin_name: str = Field(title="Admin Name")
    capital: str = Field(title="Capital")
    population: float = Field(title="Population")

def cities_list() -> list[City]:
    cities_file = Path(__file__).parent / "cities.json"
    with open(cities_file, "r", encoding="utf-8") as f:
        data = json.load(f)
    cities = [City(**city) for city in data]
    return cities


Далее напишем каркас для нашего примера, с помощью FastAPI. Опишем два роута, первый возвращает необходимые компоненты и данные, а второй — простое React приложение, которое отвечает за запрос и отображение компонентов, полученных из предыдущего.

from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from fastui import AnyComponent, FastUI
from fastui import components as c, prebuilt_html
from fastui.components.display import DisplayLookup, DisplayMode
from fastui.events import BackEvent, GoToEvent

app = FastAPI()

@app.get("/api/cities", response_model=FastUI, response_model_exclude_none=True)
def cities_view(page: int = 1, country=None):
    cities = cities_list()
    page_size = 10 # Количество записей в таблице, отображаемых на странице
    filter_form_initial = {}
    return c.Page( # Page - базовый контейнер для остальных компонентов
        components=[
            c.Table( # Table - базовая разметка таблицы
                data=cities[(page - 1) * page_size : page * page_size], #Создаём срез данных для заполнения таблицы
                data_model=City, #Передаём модель данных
                columns=[ # Описываем столбцы таблицы
                    DisplayLookup( #Указываем содержимое и размер столбца в процентах
                        field="city",
                        table_width_percent=33
                    ),
                    DisplayLookup(field="country", table_width_percent=33),
                    DisplayLookup(field="population", table_width_percent=33),
                ],
            ),
            c.Pagination(page=page, page_size=page_size, total=len(cities)), #Кнопки для пагинации
        ]
    )


@app.get("/{path:path}")
async def html_landing() -> HTMLResponse:
    """Простое React приложение, идёт последним, т.к. соответствует всем маршрутам"""
    return HTMLResponse(prebuilt_html(title="Большие города"))

Результат работы представлен на рисунке ниже:



Деплой


Для деплоя приложений на FastUI можно воспользоваться сервисом Apps, к сожалению рассмотренный фреймворк только набирает популярность, поэтому мы воспользуемся опцией: «деплой из Dockerfile». Для этого достаточно создать Dockerfile и разместить его в корне репозитория.

FROM python:3.11
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
EXPOSE 8000

Обратите внимание, что при отсутствии в Dockerfile параметра EXPOSE, APPS будет слушать порт 8080 контейнера.

Далее достаточно предоставить сервису доступ к аккаунту на github.


Затем остаётся следить за логами деплоя:



В случае успешного развёртывания появиться удобный дашборд с графиками нагрузки на виртуальную машину:



Заключение


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



Возможно, захочется почитать и это:

Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале

Теги:
Хабы:
Всего голосов 15: ↑14 и ↓1+18
Комментарии10

Публикации

Информация

Сайт
timeweb.cloud
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Россия
Представитель
Timeweb Cloud