До этого я писал о разработке веб приложений на Nim здесь и здесь.


Что? Какой Nim? В заголовке указан Python!

Да, до недавнего времени писать веб приложения на веб фреймворке HappyX было возможно лишь с помощью Nim. На данный момент HappyX доступен и на Python. Любой желающий может воспользоваться библиотекой, если не знает Nim.


веб фреймворк HappyX


В этой статье мы создадим фейковое API GitHub'а.


Создание Проекта


На данный момент HappyX в Python не имеет CLI, поэтому все придется делать лапками ручками. Хотя можно просто создать проект с помощью PyCharm — это мы и сделаем.


Создание проекта в PyCharm


Теперь установим саму библиотеку happyx. Нам понадобится Python версии 3.10 и выше.


pip install happyx

Первое, что нам нужно сделать — импортировать функцию new_server из библиотеки.


from happyx import new_server, JsonResponse

Далее, создадим сервер и фейковую базу данных.


app = new_server('127.0.0.1', 5000)
github_repos = [
    {'user': 'HapticX', 'repo': 'happyx', 'stars_count': 1, 'description': 'web framework'},
    {'user': 'python273', 'repo': 'vk_api', 'stars_count': 10, 'description': 'VK API for python'},
    {'user': 'pydantic', 'repo': 'pydantic', 'stars_count': 5, 'description': 'python models'},
]

Теперь можно объявлять сами эндпойнты.


Получение списка репозиториев


@app.get('/repos')
def handle():
    return github_repos

Получение информации по конкретному репозиторию


@app.get('/{user}/{repo}')
def get_repo(user: str, repo: str):
    for r in github_repos:
        if r['user'].lower() == user.lower() and r['repo'].lower() == repo.lower():
            return r
    return JsonResponse(
        {'response': 'failure'},
        status_code=404
    )

В конец файла добавляем запуск сервера:


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

Можем запускать сервер:


py main.py

Либо просто запускаем через PyCharm.


Все настолько просто?

Да, HappyX прост в использовании — что на Python, что на Nim.


Теперь к более сложному
Создадим метод для добавления нового репозитория. Для этого изменим строчку импорта:


from happyx import new_server, JsonResponse, RequestModelBase

А также добавим модель запроса:


class Repository(RequestModelBase):
    name: str
    owner: str
    description: str

И сам метод:


@app.post('/repo[repo]')
def create_repo(repo: Repository):
    if repo.name == '' or repo.owner == '':
        return JsonResponse(
            {'response': 'failure', 'msg': 'repo should have name and owner!'},
            status_code=404
        )
    github_repos.append({
        'repo': repo.name, 'user': repo.owner,
        'stars_count': 0, 'description': repo.description
    })
    return JsonResponse({'response': 'success'})

Вот и все :)
Можно запускать проект и играться в postman.


Наше API GitHub на коленке создано!


Буду рад, если вы найдете какой-либо баг и откроете issue в репозитории.
Предложения по улучшению также приветствуются ;)


Исходный код: HapticX/happyx

Комментарии (8)


  1. NightShad0w
    23.08.2023 20:22
    +2

    Выглядит один в один Flask и миллиона других подобных фреймворков для Python. В чем ключевая особенность фреймворка, помимо выхода из экосистемы Nim? И какие планы по поддержке API-first подхода?


    1. akihayase Автор
      23.08.2023 20:22
      -1

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

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


      1. whoisking
        23.08.2023 20:22
        +1

        Так а зачем вообще на него переходить?


      1. atshaman
        23.08.2023 20:22
        +3

        Same here. Хотелось бы хотя бы минимальный обзор на тему что же такое этот HappyX и чем он лучше <вставьте-что-угодно>


  1. Yuribtr
    23.08.2023 20:22

    Раз тут у нас презентация нового модного фреймворка, сразу накидаю больные вопросы:

    • Что умеет сериализатор RequestModelBase? Можете сравнить например с Pydantic?

    • Какая скорость работы? Хотелось бы увидеть happyx в этой таблице

    • Что с поддержкой асинхронных функций?

    • Что с документацией? Если честно читать ее не возможно, и она какая то куцая.

    • Вообще в чем плюсы вашего фреймворка?


    1. akihayase Автор
      23.08.2023 20:22
      +1

      1. RequestModelBase на данный момент сыроват, может в built-in типы и типы, унаследованные от него самого же. поддерживает пока что только JSON.

      2. https://web-frameworks-benchmark.netlify.app/result

      3. Над поддержкой асинхронных функций я работаю, но это кажется для меня немного сложным, ибо вызов всех функций происходит из С

      4. Работаю один, поэтому прогресс медленный: https://hapticx.github.io/happyx/#/guide/

      5. На стороне Nim это - поддержка SSR/SPA; DSL; компоненты, популярные в остальных фреймворка фичи из коробки (генерация документации, built-in UI и т.д.). Касательно Python - привязки пока что действительно сыроваты, но я работаю над этим :)


      1. Yuribtr
        23.08.2023 20:22
        +1

        Благодарю за ответы. Скорость действительно впечатляет - в 14 раз быстрее FastApi (одного из самых быстрых python фреймворков). Интересно за счет чего достигается такое ускорение?


        1. akihayase Автор
          23.08.2023 20:22

          Как я писал выше - обработка запросов происходит в С