Skip to main content

PuePy -- PyScript Frontend Framework

PuePy is an attempt to create a frontend framework using PyScript. PuePy is partially inspired by Vue. It runs entirely in your browser, though server-side rendering is likely feasible. PuePy aims to support two runtime environments: PyScript Pyodide or PyScript Micropython. The Micropython option foregoes some features found in the CPython, but offers a far, far smaller runtime, making it a better option for websites. Line-of-business or scientific webapp developers may prefer the CPython version, which is heavier but more functional.

Without further ado, here's a taste:

from puepy import Page, Application, t

app = Application()


@app.page()
class Hello(Page):
    def initial(self):
        return dict(name="")

    def populate(self):
        with t.div(classes=["container", "mx-auto", "p-4"]):
            t.h1("Welcome to PyScript", classes=["text-xl", "pb-4"])
            if self.state["name"]:
                t.p(f"Why hello there, {self.state['name']}")
            else:
                t.p("Why don't you tell me your name?")
            t.input(placeholder="Enter your name", bind="name")
            t.button("Continue", classes="btn btn-lg", on_click=self.on_button_click)

    def on_button_click(self, event):
        print("Button clicked")  # This logs to console


app.mount("#app")

A few things to note:

  • The .state dictionary, which is populated by initial(), is reactive. As it changes, populate is called as necessary and the page is redrawn.
  • Events are simply and Python, but use JavaScript events under the hood (including custom events)
  • You layout your page with context managers.

Components, Props, Slots

You can define reusable components with PuePy, which also use slots (similar to Vue, Web Components, etc). Here's a simple Card component:

from puepy import Component, Prop, t

# This registers the component
@t.component()
class Card(Component):
    default_role = "card"
    props = ["help_text", Prop("show_buttons", "whether to show buttons", bool, False)]

    def populate(self):
        with t.div(classes="card-header"):
            self.insert_slot("card-header")
        with t.div(classes="card-body"):
            self.insert_slot()
            if self.show_buttons:
                with t.div(classes="card-footer"):
                    t.button("Button 1")
                    t.button("Button 2")

Using the component is simple:

@app.page("/my-page")
class MyPage(Page):
    def populate(self):
        with t.card(show_buttons=True) as card:
            with card.slot("card-header"):
                t("Show header here")
            with card.slot():
                t("This is the card body")

Where to go from here...

A few things to note:

  • PuePy is not fully documented yet
  • I haven't figured out exactly what is permanent and what isn't
  • You can examine, in git, the /examples directory and view them with python3 ./serve_examples.py

Download files

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

Source Distribution

puepy-0.1.2.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

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

puepy-0.1.2-py3-none-any.whl (13.4 kB view details)

Uploaded Python 3

File details

Details for the file puepy-0.1.2.tar.gz.

File metadata

  • Download URL: puepy-0.1.2.tar.gz
  • Upload date:
  • Size: 12.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for puepy-0.1.2.tar.gz
Algorithm Hash digest
SHA256 c572f2895ab0ed762cf81bdd44cc90a1114c2b5a565c0a657b128411e2d60455
MD5 7b946b7e20c14f1875b30d2f0c21c951
BLAKE2b-256 07b605183ca7c86935e673433b27980c12ec372d5901fb79bfd4a4d12c31ec06

See more details on using hashes here.

File details

Details for the file puepy-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: puepy-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 13.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for puepy-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 88f4c5827b7373b33a814c7bec036c21a6caa030029dbbc37ceda4a46223b302
MD5 3507c4aa7022054756b8252917e2de98
BLAKE2b-256 555a3e5c10a756a676ab34f388c258010c7d861939f8157d8668f3ae3e70a867

See more details on using hashes here.

Release history Release notifications | RSS feed

0.6.5

2 files

0.6.2

2 files

0.5.0

2 files

0.4.6

2 files

0.4.5

2 files

0.4.1

2 files

0.4.0

2 files

0.3.7

2 files

0.3.6

2 files

0.3.5

2 files

0.3.4

2 files

0.3.3

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.1

2 files

0.2.0

2 files

This release

0.1.2 This release

2 files

0.1.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page