UI components for Python using Pydantic and Jinja2 templates
Project description
PyJinHx
Declare reusable, type-safe UI components for template-based web apps in Python. PyJinHx combines Pydantic models with Jinja2 templates to give you automatic template discovery, nested composition, and JavaScript integration—all without manual wiring.
Installation
pip install pyjinhx
Core Capabilities
Automatic Template Discovery
- Define a component class and place an HTML template in the same directory with a matching name
- PyJinHx automatically finds
components/ui/button.htmlfor aButtonclass incomponents/ui/button.py - No manual template path configuration needed
Global Component Registry
- Every component automatically registers itself by its
idwhen instantiated - All registered components are available in any template context by using its id:
{{ component_id }} - Manage the registry state as you wish, have it be request-scoped - or not!
Nested Components
- Pass components as fields to other components
- Nested components are wrapped in an
Objectthat provides:.html- the rendered HTML string for simple inclusion.props- access to the component instance and its properties
- Works with single components, lists, and dictionaries
JavaScript Integration
- Place a
.jsfile next to your component template (e.g.,button.jsnext tobutton.html) - JavaScript is automatically collected during rendering and bundled into a single
<script>tag at the root level - Specify a custom JS filename with the
jsfield
Extra HTML Templates
- Include additional HTML files via the
htmlfield (list of file paths) - Each extra template is rendered and added to the context by its filename
- Access rendered content via
{{ filename.html }}in your main template
Technical Details
- Type Safety: Pydantic models provide validation and IDE support
- Template Engine: Jinja2 with FileSystemLoader (customizable)
- Rendering: Components render via
render()or automatically via__html__() - Context Management: Thread-safe context variables for registry and script collection
- Required Fields:
id(unique identifier) - Optional Fields:
js(custom JS filename),html(list of extra HTML files)
Complete Example
# components/ui/button.py
from pyjinhx import BaseComponent
class Button(BaseComponent):
id: str
text: str
variant: str = "primary"
<!-- components/ui/button.html -->
<button id="{{ id }}" class="btn btn-{{ variant }}">{{ text }}</button>
// components/ui/button.js
console.log('Button {{ id }} initialized');
# components/ui/card.py
from pyjinhx import BaseComponent
from components.ui.button import Button
class Card(BaseComponent):
id: str
title: str
content: Button
<!-- components/ui/card.html -->
<div id="{{ id }}" class="card">
<h2>{{ title }}</h2>
<div class="card-body">
{{ content.html }}
</div>
<div class="card-footer">
{{ footer.html }}
</div>
</div>
<!-- components/ui/footer.html -->
<p class="footer-text">© 2024 My App</p>
# Usage
from components.ui.card import Card
from components.ui.button import Button
action_btn = Button(id="action-1", text="Submit", variant="success")
card = Card(
id="form-card",
title="User Form",
content=action_btn,
html=["components/ui/footer.html"]
)
# Render the component
html = card.render()
# The card template can access:
# - Nested components via .html (e.g., {{ content.html }})
# - Component properties via .props (e.g., {{ content.props.text }})
# - Extra HTML templates via .html (e.g., {{ footer.html }})
# - Any registered component by ID (e.g., {{ action-1 }})
# - All JavaScript files bundled at the end
<!-- Render any component by ID in any template -->
<!-- page.html -->
<div>{{ form-card }}</div>
This example demonstrates nested components, extra HTML templates, the global registry, Object wrapping with .html and .props, automatic template discovery, JavaScript bundling, and rendering components by ID.
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 pyjinhx-0.1.2.tar.gz.
File metadata
- Download URL: pyjinhx-0.1.2.tar.gz
- Upload date:
- Size: 20.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.25
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e6e9e0f008dd6de7cf58d125c426734ff7fd4385e70a64bf9256e5ec172c3b7b
|
|
| MD5 |
01e2747264cf78b1236876e6d898608c
|
|
| BLAKE2b-256 |
b663a32332258488040b7c6e895fa4903bec2a04e8e7baeddc6181158db1c12e
|
File details
Details for the file pyjinhx-0.1.2-py3-none-any.whl.
File metadata
- Download URL: pyjinhx-0.1.2-py3-none-any.whl
- Upload date:
- Size: 6.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.25
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7aa52d9a49ea2caa8e53481a695f03d37166e4d2e978d54ae31d2f6dc7b7cb53
|
|
| MD5 |
4f107afb4784717f75443776207d3422
|
|
| BLAKE2b-256 |
43726382b0733e89b16aee2668d900744595ea908dc7f50582c94b8dfbf3bd95
|