Skip to main content

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 source
pip install git+https://github.com/pyx-framework/pyx.git

# For development
git clone https://github.com/pyx-framework/pyx.git
cd pyx
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)

๐Ÿ› ๏ธ 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
ARCHITECTURE.md MVC architecture
BLUEPRINT.md Design & vision
ANALYSIS.md Framework analysis

๐Ÿ”ฎ 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 (@var decorator) โœจ 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/pyx-framework/pyx.git
cd pyx
pip install -e .
pyx test

Built with โค๏ธ by PyX Team

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

usepyx-0.1.0.tar.gz (198.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

usepyx-0.1.0-py3-none-any.whl (219.5 kB view details)

Uploaded Python 3

File details

Details for the file usepyx-0.1.0.tar.gz.

File metadata

  • Download URL: usepyx-0.1.0.tar.gz
  • Upload date:
  • Size: 198.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for usepyx-0.1.0.tar.gz
Algorithm Hash digest
SHA256 3bfb6092e8c21ff676a784b5b2ea92658ec1849f6ea04eb8d5769a46191f6d6a
MD5 d6b5b6417de0722cf5df758c3adefb0d
BLAKE2b-256 64ffe7d15b35537116d9f52a21908de17217f6e35f793d83a5c3511f2e10993b

See more details on using hashes here.

File details

Details for the file usepyx-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: usepyx-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 219.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for usepyx-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c4adbf3e9a2b33a64ed24b7feb1b86b842d0fc83cd5b9a51da1ae0f229e5e542
MD5 07e78937f2a9512517d5b47e198243e9
BLAKE2b-256 743f3476d22dc9082baab3846b1c1b4081e53f0b8dbc87ccb2438916ab234d8a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page