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
.statedictionary, which is populated byinitial(), 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
/examplesdirectory and view them withpython3 ./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
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 puepy-0.2.1.tar.gz.
File metadata
- Download URL: puepy-0.2.1.tar.gz
- Upload date:
- Size: 13.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/5.0.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b3d4cf51fc80ecfa8b574fd57177c24c38771e18788ec18865c9f4e56dde544
|
|
| MD5 |
3e12764b077a3d7a4b1515d7ea48a99e
|
|
| BLAKE2b-256 |
095a1647d9b7172879da64ca621203eb85027e8fe0e89adb7a23702f69362322
|
File details
Details for the file puepy-0.2.1-py3-none-any.whl.
File metadata
- Download URL: puepy-0.2.1-py3-none-any.whl
- Upload date:
- Size: 15.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/5.0.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f13c5e75bab31825ca849bc2913fe402189986cf6f35c3ec195296ceb3256678
|
|
| MD5 |
8d2c079937c9e79ecc1d325298519088
|
|
| BLAKE2b-256 |
52aba3e69c798536090584e570cf0e4ca8371b9017b8b35dde999130ceb88da6
|