До этого я писал о разработке веб приложений на Nim здесь и здесь.
Что? Какой Nim? В заголовке указан Python!
Да, до недавнего времени писать веб приложения на веб фреймворке HappyX было возможно лишь с помощью Nim. На данный момент HappyX доступен и на Python. Любой желающий может воспользоваться библиотекой, если не знает Nim.
В этой статье мы создадим фейковое API GitHub'а.
Создание Проекта
На данный момент HappyX в Python не имеет CLI, поэтому все придется делать лапками ручками. Хотя можно просто создать проект с помощью 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)
Yuribtr
23.08.2023 20:22Раз тут у нас презентация нового модного фреймворка, сразу накидаю больные вопросы:
Что умеет сериализатор RequestModelBase? Можете сравнить например с Pydantic?
Какая скорость работы? Хотелось бы увидеть happyx в этой таблице
Что с поддержкой асинхронных функций?
Что с документацией? Если честно читать ее не возможно, и она какая то куцая.
Вообще в чем плюсы вашего фреймворка?
akihayase Автор
23.08.2023 20:22+1RequestModelBase на данный момент сыроват, может в built-in типы и типы, унаследованные от него самого же. поддерживает пока что только JSON.
Над поддержкой асинхронных функций я работаю, но это кажется для меня немного сложным, ибо вызов всех функций происходит из С
Работаю один, поэтому прогресс медленный: https://hapticx.github.io/happyx/#/guide/
На стороне Nim это - поддержка SSR/SPA; DSL; компоненты, популярные в остальных фреймворка фичи из коробки (генерация документации, built-in UI и т.д.). Касательно Python - привязки пока что действительно сыроваты, но я работаю над этим :)
NightShad0w
Выглядит один в один Flask и миллиона других подобных фреймворков для Python. В чем ключевая особенность фреймворка, помимо выхода из экосистемы Nim? И какие планы по поддержке API-first подхода?
akihayase Автор
Ключевая особенность заключается как раз в том, что это привязки на Python. А выглядит использование Happyx как "Flask и множество других фреймворком" не случайно, а чтобы людям было удобно переходить на него.
В дальнейшем планирую добавить поддержку SPA, как и в оригинале. Ну и переносить остальные функции.
whoisking
Так а зачем вообще на него переходить?
atshaman
Same here. Хотелось бы хотя бы минимальный обзор на тему что же такое этот HappyX и чем он лучше <вставьте-что-угодно>