Kode Sumber : https://github.com/volfpeter/fasthx
Dokumentasi dan contoh : https://volfpeter.github.io/fasthx
Rendering sisi server FASTAPI dengan dukungan HTMX bawaan.
Fitur Utama:
htmy , jinja2 , atau dominate .Paket tersedia di PYPI dan dapat diinstal dengan:
$ pip install fasthxPaket ini memiliki dependensi opsional untuk integrasi resmi berikut:
pip install fasthx[htmy] .pip install fasthx[jinja] . Untuk contoh lengkap, tetapi sederhana yang menampilkan penggunaan dasar FastHX , silakan lihat folder contohnya.
Membutuhkan: pip install fasthx[htmy] .
Melayani permintaan HTML dan HTMX dengan HTMY semudah membuat instance fasthx.htmy.HTMY dan menggunakan metode dekorator hx() dan page() pada rute Anda.
Contoh di bawah ini mengasumsikan keberadaan IndexPage dan komponen htmy UserList . Contoh kerja penuh dengan komponen htmy dapat ditemukan di sini.
from datetime import date
from fastapi import FastAPI
from pydantic import BaseModel
from fasthx . htmy import HTMY
# Pydantic model for the application
class User ( BaseModel ):
name : str
birthday : date
# Create the FastAPI application.
app = FastAPI ()
# Create the FastHX HTMY instance that renders all route results.
htmy = HTMY ()
@ app . get ( "/users" )
@ htmy . hx ( UserList ) # Render the result using the UserList component.
def get_users ( rerenders : int = 0 ) -> list [ User ]:
return [
User ( name = "John" , birthday = date ( 1940 , 10 , 9 )),
User ( name = "Paul" , birthday = date ( 1942 , 6 , 18 )),
User ( name = "George" , birthday = date ( 1943 , 2 , 25 )),
User ( name = "Ringo" , birthday = date ( 1940 , 7 , 7 )),
]
@ app . get ( "/" )
@ htmy . page ( IndexPage ) # Render the index page.
def index () -> None : ... Membutuhkan: pip install fasthx[jinja] .
Untuk mulai menyajikan permintaan HTML dan HTMX, yang perlu Anda lakukan adalah membuat instance fasthx.Jinja dan menggunakan metode hx() atau page() sebagai dekorator di rute Anda. hx() hanya memicu render HTML untuk permintaan HTMX, sedangkan page() tanpa syarat membuat HTML. Lihat kode contoh di bawah ini:
from fastapi import FastAPI
from fastapi . templating import Jinja2Templates
from fasthx import Jinja
from pydantic import BaseModel
# Pydantic model of the data the example API is using.
class User ( BaseModel ):
first_name : str
last_name : str
# Create the app.
app = FastAPI ()
# Create a FastAPI Jinja2Templates instance and use it to create a
# FastHX Jinja instance that will serve as your decorator.
jinja = Jinja ( Jinja2Templates ( "templates" ))
@ app . get ( "/" )
@ jinja . page ( "index.html" )
def index () -> None :
...
@ app . get ( "/user-list" )
@ jinja . hx ( "user-list.html" )
async def htmx_or_data () -> list [ User ]:
return [
User ( first_name = "John" , last_name = "Lennon" ),
User ( first_name = "Paul" , last_name = "McCartney" ),
User ( first_name = "George" , last_name = "Harrison" ),
User ( first_name = "Ringo" , last_name = "Starr" ),
]
@ app . get ( "/admin-list" )
@ jinja . hx ( "user-list.html" , no_data = True )
def htmx_only () -> list [ User ]:
return [ User ( first_name = "Billy" , last_name = "Shears" )]Lihat contoh kerja lengkap di sini.
Membutuhkan: pip install fasthx .
Jika Anda ingin menggunakan mesin rendering tanpa integrasi fasthx, Anda dapat dengan mudah membangun di atas dekorator hx() dan page() yang memberi Anda semua fungsionalitas yang Anda butuhkan. Yang perlu Anda lakukan adalah mengimplementasikan protokol HTMLRenderer .
Demikian pula dengan kasus Jinja, hx() hanya memicu render HTML untuk permintaan HTMX, sedangkan page() tanpa syarat membuat HTML. Lihat kode contoh di bawah ini:
from typing import Annotated , Any
from fastapi import Depends , FastAPI , Request
from fasthx import hx , page
# Create the app.
app = FastAPI ()
# Create a dependecy to see that its return value is available in the render function.
def get_random_number () -> int :
return 4 # Chosen by fair dice roll.
DependsRandomNumber = Annotated [ int , Depends ( get_random_number )]
# Create the render methods: they must always have these three arguments.
# If you're using static type checkers, the type hint of `result` must match
# the return type annotation of the route on which this render method is used.
def render_index ( result : list [ dict [ str , str ]], * , context : dict [ str , Any ], request : Request ) -> str :
return "<h1>Hello FastHX</h1>"
def render_user_list ( result : list [ dict [ str , str ]], * , context : dict [ str , Any ], request : Request ) -> str :
# The value of the `DependsRandomNumber` dependency is accessible with the same name as in the route.
random_number = context [ "random_number" ]
lucky_number = f"<h1> { random_number } </h1>"
users = "" . join (( "<ul>" , * ( f"<li> { u [ 'name' ] } </li>" for u in result ), "</ul>" ))
return f" { lucky_number } n { users } "
@ app . get ( "/" )
@ page ( render_index )
def index () -> None :
...
@ app . get ( "/htmx-or-data" )
@ hx ( render_user_list )
def htmx_or_data ( random_number : DependsRandomNumber ) -> list [ dict [ str , str ]]:
return [{ "name" : "Joe" }]
@ app . get ( "/htmx-only" )
@ hx ( render_user_list , no_data = True )
async def htmx_only ( random_number : DependsRandomNumber ) -> list [ dict [ str , str ]]:
return [{ "name" : "Joe" }]Lihat contoh kerja lengkap di sini.
Jinja2 yang kompleks dengan fitur-fitur seperti pencarian aktif, pemuatan malas, peristiwa server-sent, pemicu HTMX sisi server, dialog, dan integrasi tailwindCSS dan Daisyui. Satu -satunya ketergantungan paket ini adalah fastapi .
Gunakan ruff untuk serat dan format, mypy untuk analisis kode statis, dan pytest untuk pengujian.
Dokumentasi ini dibangun dengan mkdocs-material dan mkdocstrings .
Jangan ragu untuk mengajukan pertanyaan atau meminta fitur baru.
Dan tentu saja semua kontribusi dipersilakan, termasuk lebih banyak dokumentasi, contoh, kode, dan tes.
Tujuannya adalah menjadikan fasthx proyek yang lengkap yang membuat kasus penggunaan HTMX Anda yang paling kompleks mudah diimplementasikan.
Paket ini bersumber terbuka di bawah ketentuan lisensi MIT.
Terima kasih untuk Smart-now untuk mendukung proyek ini.
![]()