Litestar đáng để thử một lần
(b-list.org)- Litestar là một viên ngọc ít được biết đến trong số các framework web bất đồng bộ của Python
- Nhờ khả năng mở rộng nhanh và kiến trúc linh hoạt, nó có thể dễ dàng áp dụng cho nhiều loại dự án
- Cung cấp mô hình hóa dữ liệu không phụ thuộc vào các thư viện cụ thể như Pydantic
- Tích hợp SQLAlchemy rất tốt, mạnh về kết nối và quản lý cơ sở dữ liệu
- Có thể đưa vào công việc thực tế ngay nhờ các tính năng tích hợp sẵn như xác thực, caching, logging, monitoring
Tổng quan về Litestar
- Trong vài năm gần đây, các framework web Python async-first, dựa trên type hint ngày càng được chú ý, và Litestar là một trong số đó mà tôi đã chọn để tích lũy kinh nghiệm sử dụng
- Khi thực tế áp dụng Litestar làm framework chính trong nhiều dự án, sự tin tưởng vào lựa chọn này ngày càng tăng
- Nhiều lập trình viên web Python vẫn chưa biết đến Litestar, nên bài viết này giới thiệu các ưu điểm và điểm nổi bật chính của nó
Ví dụ và so sánh framework
-
Litestar cho phép viết rất dễ dàng cả một ứng dụng web single-file cực kỳ đơn giản
- route decorator là một hàm độc lập không gắn với đối tượng app
- Trong ví dụ minh họa, khi truy cập
/greet?name=Bobsẽ trả về “Hi, Bob!” - Nếu thiếu tham số bắt buộc, hệ thống tự động trả về phản hồi 400
-
Khác với các microframework Python hiện có như Flask hay FastAPI, Litestar có đặc điểm kiến trúc giúp mở rộng một cách tự nhiên ở nhiều quy mô dự án
- Cách làm của Flask hoặc FastAPI có route decorator gắn với đối tượng app nên khi tách ra nhiều file có thể phát sinh vấn đề import vòng tròn
- Thông thường phải dùng route registry cấp dưới (Flask/Quart dùng blueprint, FastAPI dùng APIRouter, v.v.), nên hoặc làm tăng rào cản tiếp cận, hoặc buộc phải thay đổi cấu trúc
- Nhưng với Litestar, decorator là hàm độc lập, nên việc chuyển đổi giữa app một file và cấu trúc phân tán quy mô lớn rất gọn gàng
-
Nhờ kiến trúc cơ bản và cách viết tài liệu của Litestar, khái niệm router và nhóm tính năng có thể được giới thiệu ngay từ rất sớm, giúp duy trì tính nhất quán ngay cả khi xây dựng API phức tạp
- Tính composability là thế mạnh, như dependency injection, phân quyền, chia sẻ config theo route
- Có thể đăng ký cùng một route nhiều lần để áp dụng xác thực hoặc dependency khác nhau theo từng môi trường
Mô hình hóa không phụ thuộc vào Pydantic
-
FastAPI và một số framework khác phụ thuộc dữ liệu rất mạnh vào Pydantic
- Pydantic mạnh về kiểm tra và serialize dữ liệu dựa trên kiểu, nhưng khó tích hợp trực tiếp với ORM (SQLAlchemy)
- Trong thực tế, thường phải viết riêng model SQLAlchemy và model Pydantic, khá phiền phức
-
Litestar hỗ trợ tổng quát nhiều kiểu khác nhau ngoài Pydantic như dataclasses, msgspec, attrs, SQLAlchemy model
- Có serialization plugin protocol nên khả năng mở rộng cao
- Tích hợp chức năng tự động trích xuất DTO (data transfer object), nên chỉ cần thay đổi lớp dữ liệu gốc là DTO tự phản ánh theo
- Cũng có thể khai báo đơn giản việc loại trừ một phần field, bao gồm field, ánh xạ tên, DTO cho partial update, v.v.
- Nhờ vậy có thể tránh việc khai báo lặp field của model và các lỗi thường gặp trong quá trình đồng bộ thủ công
Tích hợp với SQLAlchemy và giới thiệu Advanced Alchemy
-
SQLAlchemy ORM gần như là chuẩn thực tế cho kết nối DB trong Python
- Litestar có mức tích hợp rất tốt với SQLAlchemy, như tự động serialize schema, tự động hóa DTO, plugin quản lý session, plugin tổng hợp, v.v.
-
Thư viện Advanced Alchemy (do đội ngũ Litestar duy trì) mở rộng thêm năng lực của SQLAlchemy
- Cung cấp nhiều tính năng cải thiện chất lượng như PK lớn không phụ thuộc database, timestamp tự động, khóa UUID, kiểu JSON, tích hợp migration Alembic, Seed/Export, v.v.
- Một tính năng đáng chú ý là hỗ trợ trừu tượng hóa repository và service layer, tự động cung cấp nhiều chức năng lưu trữ như CRUD và pagination
- Khác với Django, ở các framework có hướng dẫn cấu trúc không mạnh, đây là cách tổ chức đáng khuyến nghị để đưa repository/service layer vào
Các đặc điểm khác và tính năng hỗ trợ tích hợp sẵn
- Litestar cũng cung cấp sẵn trong framework các thành phần như hệ thống xác thực (guard function, middleware), caching (stores), logging, phản hồi lỗi chuẩn hóa, metric dựa trên Prometheus/OpenTelemetry, hỗ trợ htmx
- Khác với các microframework khác, khi triển khai một số tính năng sẽ không cần đi tìm thêm thư viện bên ngoài hoặc tự viết glue code tùy biến
- Vẫn giữ được sự gọn nhẹ của một "microframework", nhưng khi cần mở rộng hoặc thêm tính năng thì có thể dùng ngay theo nhu cầu
- Đây không hẳn là bản thay thế cho Django/Flask, mà là một khái niệm mang các điểm mạnh của framework ở ngôn ngữ khác như Java Spring Boot (cấu trúc ban đầu + tính tiện dụng, v.v.) vào Python theo cách Pythonic
- Nhìn chung, đây là một lựa chọn có năng suất cao và lợi thế cấu trúc cho phát triển web Python trong thực tế
Kết luận
- Litestar đang nổi lên như một framework mà lập trình viên web Python nên cân nhắc ít nhất một lần, nhờ tính bất đồng bộ, nền tảng kiểu dữ liệu, khả năng mở rộng linh hoạt, mô hình dữ liệu không bị bó chặt, ORM xuất sắc và nhiều tính năng tích hợp sẵn
- Kết quả từ việc dùng lặp lại trong các dự án thực tế cho thấy nó có năng suất và khả năng bảo trì cao ngay cả trong nhiều môi trường dự án khác nhau như startup
- Hy vọng các lập trình viên sẽ đưa Litestar vào danh sách lựa chọn cho dự án web Python tiếp theo
2 bình luận
Vấn đề “import vòng lặp” của Python chẳng phải đã có hướng giải quyết khá rõ ràng rồi sao? Để xem đó là một vấn đề nghiêm trọng thì tôi thấy vẫn hơi gượng ép.
Ý kiến Hacker News
@post("/route", exception_handlers={...})tạo cảm giác hơi gượng. Tôi hy vọng sau này sẽ có công cụ tích hợp tốt hơn và trải nghiệm phát triển được cải thiện thêm@postformđể xử lý toàn bộ phần liên quan đến form là được chăng