소스 코드 : https://github.com/volfpeter/fasthx
문서 및 예 : https://volfpeter.github.io/fasthx
HTMX 지원이 내장 된 FastApi 서버 측 렌더링.
주요 기능 :
htmy , jinja2 또는 dominate 과 함께 작동합니다.패키지는 PYPI에서 사용할 수 있으며 다음과 같이 설치할 수 있습니다.
$ pip install fasthx패키지에는 다음 공식 통합에 대한 선택적 종속성이 있습니다.
pip install fasthx[htmy] .pip install fasthx[jinja] . FastHX 의 기본 사용을 보여주는 완전하지만 간단한 예는 예제 폴더를 참조하십시오.
요구 사항 : pip install fasthx[htmy] .
HTML 및 HTMX 요청을 HTMY로 제공하는 것은 fasthx.htmy.HTMY 인스턴스를 생성하고 경로에서 hx() 및 page() 데코레이터 메소드를 사용하는 것만 큼 쉽습니다.
아래의 예는 IndexPage 및 UserList htmy 구성 요소의 존재를 가정합니다. htmy 구성 요소와의 전체 작업 예는 여기에서 찾을 수 있습니다.
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 : ... 요구 사항 : pip install fasthx[jinja] .
HTML 및 HTMX 요청에 서비스를 시작하려면 fasthx.Jinja 인스턴스를 생성하고 hx() 또는 page() 메소드를 경로에서 데코레이터로 사용하기 만하면됩니다. hx() 는 HTMX 요청에 대한 HTML 렌더링을 트리거하는 반면, page() 무조건 HTML을 렌더링합니다. 아래의 예제 코드를 참조하십시오.
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" )]여기에서 전체 작업 예제를 참조하십시오.
요구 사항 : pip install fasthx .
FASTHX 통합없이 렌더링 엔진을 사용하려면 hx() 및 page() 데코레이터를 쉽게 빌드하여 필요한 모든 기능을 제공 할 수 있습니다. HTMLRenderer 프로토콜을 구현하기 만하면됩니다.
Jinja Case와 마찬가지로 hx() 는 HTMX 요청에 대한 HTML 렌더링 만 트리거하는 반면 page() 무조건 HTML을 렌더링합니다. 아래의 예제 코드를 참조하십시오.
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" }]여기에서 전체 작업 예제를 참조하십시오.
Jinja2 예제. 이 패키지의 유일한 종속성은 fastapi 입니다.
라인 및 서식에는 ruff 사용하고 정적 코드 분석을위한 mypy 및 테스트를위한 pytest 사용하십시오.
이 문서는 mkdocs-material 및 mkdocstrings 로 구축되었습니다.
질문하거나 새로운 기능을 요청하십시오.
물론 더 많은 문서, 예제, 코드 및 테스트를 포함하여 모든 기여를 환영합니다.
목표는 fasthx 가장 복잡한 HTMX 사용 사례조차도 쉽게 구현할 수 있도록 균형 잡힌 프로젝트로 만드는 것입니다.
패키지는 MIT 라이센스 조건에 따라 오픈 소스입니다.
프로젝트를 지원해 주신 Smart-Now에게 감사합니다.
![]()