Mountaineer: Python plus ReactJS într-un framework
Două framework-uri într-unul singur - bateriile sunt incluse!
Nu am foarte multă experiență cu Python, însă cred că pot recunoaște un framework web cu potențial atunci când îl văd. Mountaineer, păstrează structura MVC cu care ne-am obișnuit, însă a renunțat complet la tempate-uri generate în backend și deleagă această ”corvoadă” către un alt framework deja matur - React; Care pe lângă client-side rendering, este configurat implicit să facă server-side rendering la html.
Așadar, acest framework este o alipire între FastAPI și ReactJS, dar nu doar atât, deoarece că vine cu tooling și suport pentru data binding bidirecțional din modele către frontend-ul de React.
Structura unui proiect
.
├── README.md
├── docker-compose.yml
├── poetry.lock
├── pyproject.toml
└── webapp
├── __init__.py
├── app.py
├── cli.py
├── config.py
├── controllers
│ ├── __init__.py
│ ├── detail.py
│ └── home.py
├── main.py
├── models
│ ├── __init__.py
│ └── detail.py
└── views
├── app
│ ├── detail
│ │ └── page.tsx
│ ├── home
│ │ └── page.tsx
│ └── main.css
├── package.json
├── postcss.config.js
└── tailwind.config.js
Top-level, avem fișierul de configrare, un lockfile pentru Poetry1 specific proiectului și un docker-compose, unde definim servicii externe. Implicit tool-ul de generare de cod, folosește PostgreSQL ca bază de date.
Apoi, sursele aplicației, sunt organizate în cele trei categorii: models, controllers și views. Tot ce ține de React este în localizat în views, unde avem un package.json și fișierul de configurare Tailwind2. Aici avem nevoie de node/npm pentru instalearea pachetelor specifice.
SSR cu React și useServer
Pentru data binding și server side rendering, mountaineer folosește un hook special: useServer, care oferă componentelor UI datele definite în modele și leagă acțiunile în backend:
Acestea vor fi autocompletate de către IDE, iar state-ul este întodeauna sincronizat, folosind un decorator special și anume @sideeffect
, în controller:
Mountaineer detectează prezența funcției cu efect secundar și evaluează semnătura acesteia. Apoi o expune către frontend ca o funcție asincronă.
HomeController, expune funcția add_todo
iar la adăugarea unui item, componenta își va reîncărca lista, fără a fi nevoie de extra cod.
Această caracteristică se extinde cu suportul pentru SSR - state-ul rămâne pe server și aplicația poate fi utilizată și când javascript este dezactivat.
SQLModel + Pydantic
Modelele se definesc în directorul models
, și fiecare model este și un obiect Pyhton. Pydantic asigură validarea și suportul pentru adnotări în IDE:
Această convenție păstrează compatibilitatea cu SQLAlchemy, facilitând migrarea de între cele două ORM-uri dar și integrarea cu FastAPI.
Framework-ul este la versiunea 0.4, așadar nu este încă recomandat pentru proiecte deja în producție, însă pentru un hobby project sau un MVP mi se pare potrivit.
Puteți afla mai multe despre Mountaineer pe pagina proiectului: www.mountaineer.sh sau pe github: piercefreeman/mountaineer.
Tailwind CSS (EN)