Pure Python Full-Stack Framework: No JavaScript, no HTML mess, just Zen Mode.
Project description
๐ PyX Framework
"No JavaScript, no HTML mess, just Zen Mode"
The Pure Python Full-Stack Web Framework
PyX adalah framework full-stack yang memungkinkan Anda membangun aplikasi web 100% dengan Python - tanpa JavaScript, tanpa HTML templates, tanpa context switching.
โจ Features
| Category | Features |
|---|---|
| ๐ 100% Python | UI, Backend, Database - semua Python |
| โก High Performance | Granian server (Rust-powered) |
| ๐ง Zen Mode | Semua via ui.*, db.* namespace |
| ๐จ 100+ Components | Premium UI components |
| ๐ก Real-time | WebSocket Rooms & Presence |
| ๐๏ธ Database ORM | Relationships, Migrations, N+1 solution |
| ๐ Auth Built-in | Login, Register, Roles, Security Headers |
| ๐ค AI Ready | Built-in OpenAI/Claude/Gemini integration |
| โ๏ธ Cloud Native | Unified Storage (S3/GCS/Local) |
| ๐ Batteries | Email, Jobs, i18n, PWA, SEO, OpenAPI |
๐ฆ Installation
# From PyPI
pip install usepyx
# From source
pip install git+https://github.com/sukirman1901/usePyX.git
# For development
git clone https://github.com/sukirman1901/usePyX.git
cd usePyX
pip install -e .
๐ Quick Start
# Create project
pyx init myapp
cd myapp
# Run
pyx run
Open http://localhost:8000 ๐
๐ง Zen Mode
Satu import untuk semuanya:
from pyx import ui, State, var, redirect, Model, Field
# โก State Management
class CounterState(State):
count: int = 0
@var # Computed var - auto-recalculates!
def double(self) -> int:
return self.count * 2
def increment(self):
self.count += 1
def reset(self):
self.count = 0
return redirect("/") # Server-driven navigation!
# ๐จ UI with State binding
def counter_page():
return ui.div(
ui.h1(f"Count: {CounterState.count}"),
ui.p(f"Double: {CounterState.double}"),
ui.button("Add").on_click(CounterState.increment),
ui.button("Reset").on_click(CounterState.reset),
).p(8)
# ๐๏ธ Database
class User(Model, table=True):
id: int = Field(primary_key=True)
name: str
email: str = Field(unique=True)
๐จ UI Components
Zen Mode Styling
# Pythonic styling (tidak perlu Tailwind strings)
ui.div("Hello").style(
bg="blue-500",
color="white",
p=4,
rounded="xl",
shadow="lg"
)
# Presets
ui.button("Submit").apply(ui.preset("button_primary"))
100+ Components
# Navigation
ui.navbar(brand=..., items=[...])
ui.sidebar(items=[...])
ui.breadcrumb([...])
# Layout
ui.container(...)
ui.hero(title="...", subtitle="...")
ui.section(title="...", children=...)
ui.footer(...)
# Interaction
ui.modal(trigger=..., content=...)
ui.tabs([...])
ui.accordion([...])
# Data
ui.datagrid(data)
ui.chart(data, type="line")
# Forms
ui.input(placeholder="...")
ui.select(options=[...])
ui.file_upload(accept="image/*")
๐๏ธ Database ORM
Relationships
from pyx import db
from typing import List, Optional
class User(db.Model, table=True):
id: Optional[int] = db.Column(primary_key=True)
name: str
posts: List["Post"] = db.Relationship(back_populates="author")
class Post(db.Model, table=True):
id: Optional[int] = db.Column(primary_key=True)
title: str
author_id: int = db.Column(foreign_key="user.id")
author: User = db.Relationship(back_populates="posts")
db.init()
Queries
# CRUD
user = User(name="John")
db.save(user)
db.delete(user)
# Find
users = db.find_all(User)
user = db.get(User, 1)
user = db.filter(User, active=True)
# Eager loading (N+1 solution)
users = db.with_relations(User, "posts")
# Query builder
users = (
db.query(User)
.where(active=True)
.order_by("name")
.limit(10)
.all()
)
Migrations
pyx generate migration add_users_table
pyx migrate up
pyx migrate down
๐ Authentication
from pyx.contrib.auth import User, AuthState
# User model with password hashing
user = User(email="admin@pyx.dev", username="admin")
user.set_password("secret123")
# Verify password
if user.check_password("secret123"):
print("Login successful!")
# AuthState for login/logout flow
class MyAuth(AuthState):
def login(self):
# Built-in validation & redirect
return super().login()
# UI with auth binding
ui.input(placeholder="Email").on_change(MyAuth.set_email)
ui.input(type="password").on_change(MyAuth.set_password)
ui.button("Login").on_click(MyAuth.login)
๐ก๏ธ Enterprise Security
PyX is "Secure by Default" with built-in protection against common vulnerabilities.
| Feature | Description |
|---|---|
| ๐ Bcrypt Hashing | Auto-salted password hashing |
| ๐ฆ Rate Limiting | IP-based request throttling |
| ๐ก๏ธ CSRF & XSS | Built-in protection & sanitization |
| ๐ Security Headers | OWASP-recommended headers (HSTS, CSP) |
| ๐ซ Brute-force | Account lockout mechanism |
| ๐ SQL Injection | Prevented via parameterized queries |
๐ ๏ธ CLI Commands
Project Management
pyx init myapp # Create new project
pyx run # Run development server
pyx build # Build for production (SSG)
pyx test # Run tests
Database Commands (NEW!)
pyx db init # Initialize Alembic migrations
pyx db makemigrations # Generate migration from model changes
pyx db migrate # Apply pending migrations
pyx db rollback # Rollback last migration
pyx db history # Show migration history
pyx db current # Show current revision
Code Generators
# Generate model
pyx g model User name:str email:str
# Generate page
pyx g page dashboard
# Generate component
pyx g component UserCard
# Generate API (with CRUD)
pyx g api users --crud
# Generate test
pyx g test users
# Generate migration
pyx g migration add_posts_table
๐ก Real-time
from pyx import event
@event("message")
def on_message(data, client):
broadcast({
"type": "new_message",
"text": data["text"]
})
๐ง Zen Mode Namespaces
# NEW! State Management
from pyx import State, var, redirect, alert, toast
class AppState(State):
count: int = 0
@var
def doubled(self) -> int:
return self.count * 2
def increment(self):
self.count += 1
return toast("Incremented!", "success")
# NEW! Background Tasks
from pyx import background, delayed, periodic
@background
async def send_email(user_id):
# Runs without blocking UI
await email.send(...)
@periodic(60)
def check_notifications():
# Runs every 60 seconds
...
# Database (NEW API)
from pyx import Model, Field, session, Query, select
class User(Model, table=True):
id: int = Field(primary_key=True)
email: str = Field(unique=True)
with session() as db:
users = db.exec(select(User)).all()
# Session Management
from pyx import Session
session = Session()
session['user_id'] = 123
session.save()
# Auth Module
from pyx.contrib.auth import User, AuthState
# UI (Frontend)
from pyx import ui
ui.button("Click").on_click(AppState.increment)
ui.input().on_change(AppState.set_count) # Auto-setter!
# Cloud Storage
from pyx import storage
url = storage.upload(file, folder="uploads")
# WebSocket Rooms
ws.join("chat:1", client)
ws.broadcast("chat:1", {"msg": "Hello"})
users = ws.presence("chat:1")
# AI Integration
response = await ai.chat("Summarize this", system="You are helpful")
embedding = await ai.embed("Search query")
# API Docs
docs.configure(app, title="My API", version="2.0")
๐ Enterprise Features
1. SPA Navigation (Turbo Drive)
PyX automatically handles navigation like a Single Page Application (SPA), updating only the content that changes without full page reloads.
# Automatic SPA Link
ui.link_button("Go to Dashboard", "/dashboard")
# Manual Client-Side Navigation
ui.button("Home").on_click(JS.navigate("/"))
2. Client-Side Interactions (Zero Latency)
Use JS helpers for instant UI updates without server roundtrips.
from pyx.client import JS
# Toggle Class
ui.button("Menu").on_click(JS.toggle_class("#sidebar", "hidden"))
# Copy to Clipboard
ui.button("Share").on_click(
JS.copy_to_clipboard("https://myapp.com").then_toast("Link copied!")
)
3. SEO Suite
Strictly typed SEO metadata generator.
from pyx.seo import Metadata, JSONLD
def product_meta(params):
return Metadata(
title=f"Product {params.get('id')}",
json_ld=JSONLD.product(name="iPhone", price="999")
)
app.add_page("/product/{id}", render_page, metadata=product_meta)
๐ Project Structure
myapp/
โโโ main.py # Entry point
โโโ pages/ # File-based routing
โ โโโ index.py # โ /
โ โโโ about.py # โ /about
โ โโโ blog/
โ โโโ [slug].py # โ /blog/:slug
โโโ models/ # Database models
โโโ components/ # Reusable UI
โโโ api/ # API endpoints
โโโ tests/ # Tests
โโโ migrations/ # Database migrations
๐ Comparison
| Feature | Flask/Django | Next.js | PyX |
|---|---|---|---|
| Backend Python | โ | โ | โ |
| Frontend Python | โ | โ | โ |
| UI Components | โ | โ | โ |
| Database ORM | โ | โ | โ |
| Auth Built-in | โ | โ | โ |
| Real-time | โ ๏ธ | โ | โ |
| Single Language | โ | โ | โ |
๐ Documentation
| File | Description |
|---|---|
| SYNTAX_GUIDE.md | UI syntax reference |
| SYNTAX_GUIDE.md | UI syntax reference |
๐ฎ Roadmap
- Core UI Engine (Zen Mode)
- 100+ UI Components
- Pythonic Styling
- Database ORM with Relationships
- Migrations CLI (
pyx db *) - Authentication Module
- CLI Generators
- Testing Framework
- Logging
- Caching
- i18n / PWA / SEO
- Cloud Storage (S3/GCS)
- WebSocket Rooms & Presence
- AI/LLM Integration
- OpenAPI/Swagger Docs
- State Management โจ NEW
- Computed Vars (
@vardecorator) โจ NEW - Session Persistence โจ NEW
- Background Tasks โจ NEW
- Docker Deployment
- Cloud Templates (Vercel, Railway)
๐ก Philosophy
"Write less, do more. Python only."
PyX mengikuti filosofi bahwa developer productivity lebih penting dari ceremonial code. Semua bisa diakses via namespace sederhana - tidak perlu banyak import, tidak perlu context switching.
๐ค Contributing
git clone https://github.com/sukirman1901/usePyX.git
cd usePyX
pip install -e .
pyx test
Built with โค๏ธ by PyX Team
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file usepyx-0.1.2.tar.gz.
File metadata
- Download URL: usepyx-0.1.2.tar.gz
- Upload date:
- Size: 198.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6301abc64d003ff4e8060a523be11c7c82b86ec5e6f047b7316418812980c9bf
|
|
| MD5 |
4e0e8974fafe288dec472ddf6a45ac43
|
|
| BLAKE2b-256 |
057fece23049e5183ca8b893d30471a0a4123dc94c9a2787187c1366e42e2af8
|
File details
Details for the file usepyx-0.1.2-py3-none-any.whl.
File metadata
- Download URL: usepyx-0.1.2-py3-none-any.whl
- Upload date:
- Size: 219.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e35fa2a6600b89556c32595e49fb8ba84eee5fb39a224cc287762b5f5d12e42
|
|
| MD5 |
77c617445aa756ce7abc8816199693be
|
|
| BLAKE2b-256 |
b87b0bb4fdf63c987cc763435ebf5c93c580fab1d54441fd27cd60d4cfd8a007
|