رمز المصدر : https://github.com/volfpeter/fasthx
الوثائق والأمثلة : https://volfpeter.github.io/fasthx
عرض خادم Fastapi مع دعم HTMX مدمج.
الميزات الرئيسية:
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 ومكون htmy UserList . يمكن العثور على مثال العمل الكامل مع مكونات 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() فقط يؤدي إلى تقديم HTML لطلبات HTMX ، في حين أن 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 .
إذا كنت ترغب في استخدام محرك تقديم بدون تكامل Fashx ، فيمكنك بسهولة البناء على الديكورات hx() و page() التي تمنحك كل الوظائف التي ستحتاجها. كل ما عليك فعله هو تنفيذ بروتوكول HTMLRenderer .
على غرار حالة Jinja ، لا يؤدي hx() إلا إلى تشغيل HTML لطلبات HTMX ، في حين أن 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 مع ميزات مثل البحث النشط ، والتحميل كسول ، وأحداث خادم خادم ، ومشغلات HTMX من جانب الخادم ، وحوار الحوار ، وتكامل Tailwindcss و Daisyui. التبعية الوحيدة لهذه الحزمة هي fastapi .
استخدم ruff للاندماج والتنسيق ، mypy لتحليل التعليمات البرمجية الثابتة ، و pytest للاختبار.
تم تصميم الوثائق باستخدام mkdocs-material و mkdocstrings .
لا تتردد في طرح الأسئلة أو طلب ميزات جديدة.
وبالطبع جميع المساهمات موضع ترحيب ، بما في ذلك المزيد من الوثائق والأمثلة والرمز والاختبارات.
الهدف من ذلك هو جعل fasthx مشروعًا جيدًا يجعل حتى أكثر حالات استخدام HTMX تعقيدًا سهلة التنفيذ.
الحزمة مفتوحة المصدر في ظل ظروف ترخيص معهد ماساتشوستس للتكنولوجيا.
شكرًا لك على Smart-NOW لدعمه للمشروع.
![]()