برنامه نویسی

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

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا