Litestar เป็นสิ่งที่ควรลองดูสักครั้ง
(b-list.org)- Litestar คือหนึ่งใน อัญมณีที่ยังไม่ค่อยเป็นที่รู้จัก ในกลุ่ม Python asynchronous web framework
- ด้วย ความสามารถในการขยายตัวได้รวดเร็ว และ สถาปัตยกรรมที่ยืดหยุ่น จึงนำไปใช้กับโปรเจกต์หลากหลายรูปแบบได้ง่าย
- รองรับ การทำ data modeling ที่ไม่ผูกติดกับไลบรารีใดไลบรารีหนึ่ง เช่น Pydantic
- มี การผสานรวมกับ SQLAlchemy ที่ยอดเยี่ยม จึงเด่นด้านการเชื่อมต่อและจัดการฐานข้อมูล
- มี ฟีเจอร์ในตัวที่ใช้งานสะดวก เช่น authentication, caching, logging, monitoring ทำให้พร้อมใช้ในงานจริงได้ทันที
ภาพรวมของ Litestar
- ในช่วงไม่กี่ปีที่ผ่านมา Python web framework แบบ async-first และอิง type hints ได้รับความนิยมมากขึ้น และ Litestar ก็เป็นหนึ่งในนั้นที่ถูกเลือกมาลองใช้งานเพื่อสั่งสมประสบการณ์
- เมื่อได้นำ Litestar ไปใช้เป็น framework หลักในหลายโปรเจกต์จริง ก็ยิ่งมั่นใจในการเลือกใช้นี้มากขึ้นเรื่อย ๆ
- แม้จะเป็นนักพัฒนาเว็บ Python ก็ยังมีหลายคนที่ไม่รู้จัก Litestar บทความนี้จึงนำเสนอข้อดีและจุดเด่นหลักของมัน
ตัวอย่างและการเปรียบเทียบ framework
-
Litestar สามารถเขียน single-file web application ที่เรียบง่ายมากได้อย่างง่ายดาย
- route decorator เป็น ฟังก์ชันอิสระที่ไม่ได้ผูกกับ app object
- ในตัวอย่างโค้ด เมื่อเข้าถึง
/greet?name=Bobจะได้ผลลัพธ์เป็น “Hi, Bob!” - หากขาดพารามิเตอร์ที่จำเป็น ระบบจะตอบกลับ 400 ให้อัตโนมัติ
-
ต่างจาก Python microframework แบบเดิมอย่าง Flask หรือ FastAPI, Litestar มีลักษณะเชิงโครงสร้างที่ขยายจากโปรเจกต์ขนาดต่าง ๆ ได้อย่างเป็นธรรมชาติ
- แนวทางของ Flask หรือ FastAPI มี routing decorator ที่ผูกอยู่กับ app object จึงอาจเกิด ปัญหา circular import เมื่อแยกเป็นหลายไฟล์
- โดยทั่วไปจึงต้องใช้ route registry ชั้นล่าง (Flask/Quart ใช้ blueprint, FastAPI ใช้ APIRouter เป็นต้น) ทำให้มีทั้งกำแพงการเริ่มต้นที่สูงขึ้นหรือจำเป็นต้องเปลี่ยนโครงสร้าง
- แต่ Litestar มี decorator ที่เป็น ฟังก์ชันอิสระ จึงเปลี่ยนจากแอปไฟล์เดียวไปสู่โครงสร้างกระจายขนาดใหญ่ได้อย่างกระชับมาก
-
ด้วย สถาปัตยกรรมพื้นฐานและวิธีเขียนเอกสาร ของ Litestar ทำให้สามารถแนะนำแนวคิดเรื่อง router และการจัดกลุ่มฟังก์ชันได้ตั้งแต่ระยะแรก จึงรักษาความสม่ำเสมอได้ง่ายแม้ต้องประกอบ API ที่ซับซ้อน
- composability เป็นจุดแข็ง ไม่ว่าจะเป็น dependency injection, authorization, หรือการแชร์ config ตามเส้นทาง
- สามารถลงทะเบียน route เดียวกันหลายครั้ง เพื่อใช้ authentication หรือ dependency ตามสภาพแวดล้อมที่ต่างกันได้
การทำ modeling ที่ไม่ต้องพึ่งพา Pydantic มากเกินไป
-
FastAPI และ framework อื่น ๆ จำนวนมาก พึ่งพา Pydantic กับข้อมูลอย่างมาก
- Pydantic เด่นเรื่องการ validate และ serialize ข้อมูลตาม type แต่ เชื่อมตรงกับ ORM (SQLAlchemy) ได้ไม่ง่ายนัก
- ในงานจริงจึงมักต้องเขียนทั้ง SQLAlchemy model และ Pydantic model แยกกัน เป็นภาระที่ยุ่งยาก
-
Litestar รองรับชนิดข้อมูลได้หลากหลายแบบทั่วไป ไม่ใช่แค่ Pydantic แต่รวมถึง dataclasses, msgspec, attrs, SQLAlchemy model เป็นต้น
- มี serialization plugin protocol จึงขยายต่อได้ดี
- มีความสามารถ ดึง data transfer object (DTO) อัตโนมัติ ทำให้เพียงแก้ไข data class ต้นฉบับ ก็สะท้อนมายัง DTO อัตโนมัติ
- ไม่ว่าจะเป็นการตัดบางฟิลด์ออก การเลือกเฉพาะบางฟิลด์ การแมปชื่อ หรือ DTO สำหรับ partial update ก็ประกาศได้อย่างง่ายดาย
- จึงช่วยลดการประกาศฟิลด์ซ้ำซ้อนใน model และป้องกันความผิดพลาดที่เกิดขึ้นบ่อยจากการซิงก์ด้วยมือ
การผสานกับ SQLAlchemy และแนะนำ Advanced Alchemy
-
SQLAlchemy ORM คือมาตรฐานโดยพฤตินัยสำหรับการเชื่อมฐานข้อมูลใน Python
- Litestar ทำได้ดีมากในด้าน การผสานรวม เช่น การ serialize schema ของ SQLAlchemy อัตโนมัติ, การทำ DTO อัตโนมัติ, session management plugin, และ composite plugin
-
ฟังก์ชันของ SQLAlchemy ถูกต่อยอดเพิ่มเติมผ่าน ไลบรารี Advanced Alchemy (ดูแลโดยทีม Litestar)
- มีฟีเจอร์ ยกระดับคุณภาพ มากมาย เช่น large PK แบบ database-agnostic, timestamp อัตโนมัติ, UUID key, JSON type, การผสานกับ Alembic migration, รวมถึง Seed/Export
- ฟีเจอร์ที่น่าสนใจเป็นพิเศษคือ การรองรับ abstraction ของ repository และ service layer ซึ่งช่วยมอบความสามารถของ repository หลายอย่าง เช่น CRUD และ pagination โดยอัตโนมัติ
- สำหรับ framework ที่มีแนวทางเชิงโครงสร้างไม่เข้มเท่า Django ก็ถือว่าเป็นรูปแบบการจัดองค์กรที่น่าแนะนำสำหรับการนำ repository/service layer มาใช้
คุณสมบัติอื่น ๆ และฟีเจอร์ที่มีมาในตัว
- Litestar มีทั้งระบบ authentication (guard function, middleware), caching (stores), logging, มาตรฐาน problem response, metrics บนพื้นฐาน Prometheus/OpenTelemetry, การรองรับ htmx อยู่ภายใน framework
- ต่างจาก microframework อื่น ๆ หลายตัว ฟีเจอร์บางอย่างไม่จำเป็นต้องไปค้นหาไลบรารีภายนอกเพิ่มหรือเขียน custom glue code เอง
- มันยังคงรักษาความกระชับแบบ “microframework” เอาไว้ แต่เมื่อจำเป็นต้องขยายหรือใช้ฟีเจอร์เพิ่ม ก็หยิบมาใช้ได้ทันทีตามต้องการ
- มากกว่าจะเป็นตัวแทนของ Django/Flask มันคือแนวคิดที่นำจุดแข็งของ framework ภาษาอื่นอย่าง Java Spring Boot (เช่น โครงสร้างตั้งต้นและความสะดวก) มาปรับใช้ในแบบ Pythonic
- โดยรวมแล้วเป็นตัวเลือกที่มี ทั้งประสิทธิภาพในการพัฒนาและข้อได้เปรียบเชิงโครงสร้าง สำหรับการพัฒนาเว็บด้วย Python ในงานจริง
บทสรุป
- Litestar กำลังก้าวขึ้นมาเป็น framework ที่นักพัฒนาเว็บ Python ควรลองพิจารณาอย่างน้อยสักครั้ง ด้วยคุณสมบัติอย่าง asynchronous, type-based, การขยายตัวที่ยืดหยุ่น, data modeling ที่ไม่ผูกตายตัว, ORM ที่ยอดเยี่ยม และฟีเจอร์ในตัวที่ครบถ้วน
- จากการใช้งานซ้ำ ๆ ในโปรเจกต์จริง พบว่ามันให้ทั้ง productivity และ maintainability ในระดับสูง แม้ในสภาพแวดล้อมโปรเจกต์ที่หลากหลาย เช่น สตาร์ตอัป
- จึงหวังว่านักพัฒนาจะนำ Litestar ไปเป็นหนึ่งในตัวเลือกเมื่อวางแผนโปรเจกต์เว็บ Python ครั้งถัดไป
2 ความคิดเห็น
ปัญหา "circular import" ของ Python นี่ไม่ได้มีวิธีแก้ที่ค่อนข้างชัดเจนอยู่แล้วหรือครับ? จะมองว่าเป็นปัญหาใหญ่ก็ดูจะเกินไปหน่อยนะครับ
ความคิดเห็นจาก Hacker News
@post("/route", exception_handlers={...})ก็ให้ความรู้สึกแปลก ๆ หวังว่าในอนาคตจะมีเครื่องมือในตัวและประสบการณ์นักพัฒนาที่ดีขึ้น@postformขึ้นมาเพื่อจัดการเรื่องฟอร์มทั้งหมดได้ไม่ใช่หรือ