Lihil-یک چارچوب وب با کارایی بالا برای توسعه وب شرکت در پایتون

Lihil یک چارچوب وب مدرن است که برای تبدیل شدن پایتون به انتخاب جدی برای سیستم های پس زمینه سازمانی – از یکپارچه تا میکروسرویس – تبدیل شده است.
چرا لیل؟
پایتون مدتهاست که برای برنامه های در مقیاس بزرگ به عنوان “خیلی کند” یا “خیلی پویا” مورد انتقاد قرار گرفته است. اما زبان و اکوسیستم تکامل یافته است-Python 3.10+ یک سیستم از نوع قوی را ارائه می دهد و با پیشرفت های مداوم مانند حذف قفل مترجم جهانی (GIL) ، پایتون برای بارهای کار با کارایی بالا آماده است.
هدف لیلیل قصد دارد تا آنجا را بیاورد:
-
رقابت با عملکرد بالا و چارچوب های جاوا
-
معماری مقیاس پذیر که از برنامه های ساده به سیستم های توزیع شده رشد می کند
-
ارگونومی توسعه دهنده مدرن با تایپ استاتیک ، تزریق خودکار و طراحی API تمیز
github: https://gitulub.com/raceychan/lihil
اسناد و آموزش ها: https://lihil.cc
آنچه لیلی ارائه می دهد
عمل
Lihil 50-100 ٪ سریعتر از چارچوب های ASGI قابل مقایسه با عملکرد مشابه است.
منبع معیار (قابل تکرار):
https://github.com/raceychan/lhl_bench
پارامتر تجزیه
Lihil یک پارامتر قدرتمند و از نوع محور را فراهم می کند که ورودی های تمام منابع درخواست را کنترل می کند.
تجزیه از پرس و جو ، مسیر ، هدر و بدن
تبدیل نوع آگاهی
پشتیبانی نام مستعار از هدرها
رمزگشایی های سفارشی از طریق پارام (رمزگشایی = …)
from typing import Annotated
from lihil.params import Param
@Route("/users/{user_id}")
async def create_user(
user_id: str,
name: Annotated[str, Param("query")],
auth_token: Annotated[str, Param("header", alias="x-auth-token")],
user_data: UserPayload
):
...
اعتبار سنجی و رمزگشایی داده ها
با استفاده از MSGSPEC در زیر کاپوت ، لیل از رمزگشایی و رمزگذاری سفارشی با حداقل دیگ بخار پشتیبانی می کند.
from lihil.di import CustomEncoder
from lihil.params import Param
async def create_user(
user_id: Annotated[MyUserID, Param(decoder=decode_user_id)]
) -> Annotated[MyUserID, CustomEncoder(encode_user_id)]:
return user_id
تزریق وابستگی
سیستم DI Lihil وابستگی ها را از طریق نکات و پشتیبانی از نوع حل می کند:
چرخه های حیاتی ، تک آهنگ ، تک و همسایه
وابستگی های عمیق تو در تو
اولیه سازی تنبل
تزریق مبتنی بر کارخانه
async def get_conn(engine: Engine):
async with engine.connect() as conn:
yield conn
async def get_users(conn: AsyncConnection):
return await conn.execute(text("SELECT * FROM users"))
@Route("/users").get
async def list_users(
users: Annotated[list[User], use(get_users)],
is_active: bool = True
):
return [u for u in users if u.is_active == is_active]
آموزش های بیشتر: https://lihil.cc/ididi
سیستم پلاگین
Lihil یک سیستم افزونه انعطاف پذیر را فراهم می کند که به شما امکان می دهد توابع نقطه پایانی را با منطق سفارشی تزئین کنید – بدون دخالت در تجزیه پارامتر یا تجزیه و تحلیل امضا.
این امر به ویژه برای ویژگی هایی مانند ورود به سیستم ، معیارها ، احراز هویت یا ردیابی درخواست مفید است.
شما می توانید به راحتی یک کتابخانه شخص ثالث را در چند خط در لیل ادغام کنید
from functools import wraps
from lihil.plugins import EndpointSignature, Graph
from typing import Callable, Awaitable
from redis import RedisClient
def redis_plugin(redis: RedisClient, cache_key: str):
def inner(self, graph: Graph, func: Callable[..., Awaitable[Any]], sig: EndpointSignature[Any]):
@wraps(func)
async def wrapped(*args, **kwargs):
if result := redis.get(kwargs[cache_key]):
return result
return await func(*args, **kwargs)
return wrapped
return inner
سپس آن را در مسیرها/نقاط پایانی خود اعمال کنید
route = Route("/users/{user_id}")
@route.get(plugins=[redis_plugin(RedisClient(), cache_key="user_id")])
async def create_user(user_id: str): ...
پاسخهای مشکل ساختاری
Lihil RFC 7807 را برای بازگشت پاسخ های دقیق مشکل برای استثنائات اتخاذ می کند.
class OutOfStockError(HTTPException[str]):
__status__ = 422
def __init__(self, order: Order):
detail = f"{order} can't be placed, because {order.items} is short in quantity"
super().__init__(detail)
مشتری دریافت می کند:
{
"type_": "out-of-stock-error",
"status": 422,
"title": "The order can't be placed because items are out of stock",
"detail": "order(id=43, items=[massager]) can't be placed, because [massager] is short in quantity",
"instance": "/users/ben/orders/43"
}
سیستم حادثه
لیلیل یک سیستم رویداد یکپارچه را ارائه می دهد که پشتیبانی می کند:
انتشار (در فرآیند ، مسدود کردن)
منتشر شده (در فرآیند ، غیر مسدود کننده)
سینک (نقطه ادغام برای MQ/پایگاه داده)
from lihil import Route, status
from lihil.plugins.bus import Event, EventBus, bus_plugin
from typing import Annotated
from lihil.params import Param
class TodoCreated(Event):
name: str
content: str
async def on_create(created: TodoCreated, ctx):
...
bus_route = Route("/bus", listeners=[on_create])
@bus_route.post(plugins=[bus_plugin])
async def create_todo(
name: str,
content: str,
bus: Annotated[EventBus, Param("plugin")]
) -> Annotated[None, status.OK]:
await bus.publish(TodoCreated(name, content))
دستگیرندگان می توانند وابستگی داشته باشند و حتی می توانند رویدادهای جدید را در حین اجرا منتشر کنند.
طراحی استاندارد ، مقیاس پذیر
Lihil از میان افزار توزیع شده مانند پرتاب و منابع رویداد پشتیبانی می کند و راهنمایی هایی را برای بهترین شیوه ها و معماری تمیز ارائه می دهد. شما می توانید:
- با یک یکپارچه و مقیاس به میکروسرویس شروع کنید.
- برای حفظ قابلیت استفاده از تایپ قوی استفاده کنید.
- الگوهای افزونه گسترده را برای مشاهده ، پایداری ، آثار و غیره دنبال کنید.
برای چه کسی است
لیلیل برای توسعه دهندگان است که می خواهند:
-
ساختار و انعطاف پذیری آماده سازمانی
-
DX عالی (تجربه توسعه دهنده) با خوانایی پایتون
-
مقیاس پذیری و عملکرد واقعی
-
تایپ دقیق با بازخورد سریع و پشتیبانی قوی IDE
-
اسناد OpenAPI دقیق برای هر دو مورد موفقیت و شکست
-
پشتیبانی درجه یک از الگوهای ASYNC ، رویدادها ، جریان و RPC
نسخه سازی
لیل در V0.2.8 است ، در حال حاضر> 99 ٪ تست پوشیده شده و کاملاً تایپ شده است.
چه بعدی است
آینده در V0.2.0+:
V0.2.9 ادغام سوپابیس
سرور V0.2.10 MCP
v0.3.0 +
سازنده پرس و جو Async مبتنی بر طرحواره
اتوبوس رویداد خارج از فرآیند (به عنوان مثال ، RabbitMQ ، Kafka)
دستگیرندگان فرمان (HTTP RPC + GRPC)
👉 GIMB: https://gitulub.com/raceychan/lihil
📘 اسناد: https://lihil.cc