Name | django-puepy JSON |
Version |
0.1.2
JSON |
| download |
home_page | None |
Summary | PuePy integration for Django |
upload_time | 2024-08-03 18:31:24 |
maintainer | None |
docs_url | None |
author | Ken Kinder |
requires_python | <4.0,>=3.11 |
license | Apache |
keywords |
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# Django PuePy Integration
Provides [PuePy](https://puepy.dev) integration for Django.
## Installation
1. Install the package using pip:
```
pip install django_puepy
```
2. Add `django_puepy` to your `INSTALLED_APPS`:
```python
INSTALLED_APPS = [
...
"django_puepy",
]
```
## Usage
Take a look at the `example_app` directory for a very simple Django app that makes use of django_puepy. There are just two files:
- `example_app/backend_server.py`: Simple one-file Django app that shows a server-side Django controller
- `example_app/static/todo.py`: The frontend PuePy code that interacts with the Django controller
### Backend Usage
Our example backend app, `example_app/backend_server.py`, specifies a frontend file, a runtime, and three ajax methods that are called by the frontend.
```python
class TodoView(PuePyView):
frontend_url = "/static/todo.py"
runtime = "mpy"
@PuePyView.ajax
def add_todo(self, item):
todo_list.append(item)
return todo_list
@PuePyView.ajax
def remove_todo(self, index):
try:
del todo_list[index]
except IndexError:
pass
return todo_list
@PuePyView.ajax
def get_todos(self):
return todo_list
```
The frontend file, `static/todo.py`, is a regular PuePy app+page, but makes calls to the django_backend to interact with the ajax methods specified above:
```python
from puepy import Application, Page, t
app = Application()
from django_backend import backend
@app.page()
class TodoPage(Page):
def initial(self):
return {"todos": [], "todo_add": "", "loading": True}
def populate(self):
t.h1("Todo List")
if self.state["loading"]:
t.p("Loading...")
with t.ul(ref="todos"):
for i, todo_item in enumerate(self.state["todos"]):
t.li(
todo_item,
t.button(
"X", on_click=self.on_remove_todo_click, data_index=str(i)
),
)
t.hr()
with t.form(on_submit=self.on_add_form_submit, ref="form"):
t.input(type="text", bind="todo_add")
t.button("Add Todo")
def on_ready(self):
self.add_event_listener("load-data", self.on_load_data)
self.trigger_event("load-data")
async def on_load_data(self, event):
with self.state.mutate():
self.state["loading"] = True
try:
self.state["todos"] = await backend.get_todos()
finally:
self.state["loading"] = False
async def on_add_form_submit(self, event):
event.preventDefault()
with self.state.mutate():
self.state["loading"] = True
try:
self.state["todos"] = await backend.add_todo(self.state["todo_add"])
finally:
self.state["loading"] = False
async def on_remove_todo_click(self, event):
index = int(event.target.getAttribute("data-index"))
with self.state.mutate():
self.state["loading"] = True
try:
self.state["todos"] = await backend.remove_todo(index)
finally:
self.state["loading"] = False
app.mount("#app")
```
The result? A demo todo app.
## Project status
While PuePy is approach relative stability, this Django integration is currently only an experiment. It is not recommended for production use *at all* and will hopefully evolve over time.
Raw data
{
"_id": null,
"home_page": null,
"name": "django-puepy",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.11",
"maintainer_email": null,
"keywords": null,
"author": "Ken Kinder",
"author_email": "ken+github@kkinder.com",
"download_url": "https://files.pythonhosted.org/packages/f5/a4/2df27d9166f55f1334e1feb27dab765855103ee8290f8f3cbf11249af4ce/django_puepy-0.1.2.tar.gz",
"platform": null,
"description": "# Django PuePy Integration\n\nProvides [PuePy](https://puepy.dev) integration for Django.\n\n## Installation\n\n1. Install the package using pip:\n\n```\npip install django_puepy\n```\n\n2. Add `django_puepy` to your `INSTALLED_APPS`:\n\n```python\nINSTALLED_APPS = [\n ...\n \"django_puepy\",\n]\n```\n\n## Usage\n\nTake a look at the `example_app` directory for a very simple Django app that makes use of django_puepy. There are just two files:\n\n- `example_app/backend_server.py`: Simple one-file Django app that shows a server-side Django controller\n- `example_app/static/todo.py`: The frontend PuePy code that interacts with the Django controller\n\n### Backend Usage\n\nOur example backend app, `example_app/backend_server.py`, specifies a frontend file, a runtime, and three ajax methods that are called by the frontend.\n\n```python\nclass TodoView(PuePyView):\n frontend_url = \"/static/todo.py\"\n runtime = \"mpy\"\n\n @PuePyView.ajax\n def add_todo(self, item):\n todo_list.append(item)\n return todo_list\n\n @PuePyView.ajax\n def remove_todo(self, index):\n try:\n del todo_list[index]\n except IndexError:\n pass\n return todo_list\n\n @PuePyView.ajax\n def get_todos(self):\n return todo_list\n```\n\nThe frontend file, `static/todo.py`, is a regular PuePy app+page, but makes calls to the django_backend to interact with the ajax methods specified above:\n\n```python\nfrom puepy import Application, Page, t\n\napp = Application()\nfrom django_backend import backend\n\n\n@app.page()\nclass TodoPage(Page):\n def initial(self):\n return {\"todos\": [], \"todo_add\": \"\", \"loading\": True}\n\n def populate(self):\n t.h1(\"Todo List\")\n if self.state[\"loading\"]:\n t.p(\"Loading...\")\n with t.ul(ref=\"todos\"):\n for i, todo_item in enumerate(self.state[\"todos\"]):\n t.li(\n todo_item,\n t.button(\n \"X\", on_click=self.on_remove_todo_click, data_index=str(i)\n ),\n )\n t.hr()\n with t.form(on_submit=self.on_add_form_submit, ref=\"form\"):\n t.input(type=\"text\", bind=\"todo_add\")\n t.button(\"Add Todo\")\n\n def on_ready(self):\n self.add_event_listener(\"load-data\", self.on_load_data)\n self.trigger_event(\"load-data\")\n\n async def on_load_data(self, event):\n with self.state.mutate():\n self.state[\"loading\"] = True\n try:\n self.state[\"todos\"] = await backend.get_todos()\n finally:\n self.state[\"loading\"] = False\n\n async def on_add_form_submit(self, event):\n event.preventDefault()\n with self.state.mutate():\n self.state[\"loading\"] = True\n try:\n self.state[\"todos\"] = await backend.add_todo(self.state[\"todo_add\"])\n finally:\n self.state[\"loading\"] = False\n\n async def on_remove_todo_click(self, event):\n index = int(event.target.getAttribute(\"data-index\"))\n with self.state.mutate():\n self.state[\"loading\"] = True\n try:\n self.state[\"todos\"] = await backend.remove_todo(index)\n finally:\n self.state[\"loading\"] = False\n\n\napp.mount(\"#app\")\n```\n\nThe result? A demo todo app.\n\n## Project status\n\nWhile PuePy is approach relative stability, this Django integration is currently only an experiment. It is not recommended for production use *at all* and will hopefully evolve over time.\n\n\n\n",
"bugtrack_url": null,
"license": "Apache",
"summary": "PuePy integration for Django",
"version": "0.1.2",
"project_urls": null,
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "9a8253d4f9d816e8e8d90d76d4bd0639afa25d38f57753c8358d52b51abc8a41",
"md5": "7e0fab106ba0ebb81b53bacd153a4fb8",
"sha256": "9e8dd3125b6bdca572a0cbcdf5c5737f68c095986d3fa9209308746bce6de633"
},
"downloads": -1,
"filename": "django_puepy-0.1.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7e0fab106ba0ebb81b53bacd153a4fb8",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.11",
"size": 40085,
"upload_time": "2024-08-03T18:31:23",
"upload_time_iso_8601": "2024-08-03T18:31:23.169600Z",
"url": "https://files.pythonhosted.org/packages/9a/82/53d4f9d816e8e8d90d76d4bd0639afa25d38f57753c8358d52b51abc8a41/django_puepy-0.1.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f5a42df27d9166f55f1334e1feb27dab765855103ee8290f8f3cbf11249af4ce",
"md5": "75efb1439087591ba5a28244484c0c1a",
"sha256": "42bfe9fbccf007224b275a9fcd379661b7990ebc6ffa7a4cc1a8e4cbae515531"
},
"downloads": -1,
"filename": "django_puepy-0.1.2.tar.gz",
"has_sig": false,
"md5_digest": "75efb1439087591ba5a28244484c0c1a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.11",
"size": 39461,
"upload_time": "2024-08-03T18:31:24",
"upload_time_iso_8601": "2024-08-03T18:31:24.543148Z",
"url": "https://files.pythonhosted.org/packages/f5/a4/2df27d9166f55f1334e1feb27dab765855103ee8290f8f3cbf11249af4ce/django_puepy-0.1.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-08-03 18:31:24",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "django-puepy"
}