توی آخرین پروژهای که داشتم - که توسعه بکاند(RestAPI) یک وبسایت به علاوه یک ربات تلگرامی بود - تصمیم گرفتم که بیخیال فلسک بشم و از فریموورک FastAPI استفاده کنم. الآن که تقریباً به انتهای پروژه رسیدم، تصمیم گرفتم تجربه خودم از این فریموورک رو با شما هم به اشتراک بذارم.
همونطور که توی اسم فریموورک هم اومده، از سرعت بالایی برخورداره و توی بنچمارکها نشون داده که دست کمی از فریموورکهای زبانهایی مثل GoLang نداره!
منبع عکس بالا و مقالهای با عنوان FastAPI vs Flask رو میتونید از این لینک دنبال کنید.
از ویژگیهای خوب این فریموورک که میتونم بهشون اشاره کنم سرعت خوب، نیاز نداشتن به نوشتن کد زیاد، سرعت توسعه بالا و همچنین ساختن داکیومنت خودکار هستن.
این فریموورک بر پایه starlette هست و یک سری آپشن فوقالعاده کاربردی رو به اون اضافه میکنه که جلوتر به چندتاش اشاره میکنم.
بهترین چیزی که میتونم راجع بهش بگم اینه که pythonic هست. حالا پایتونیک بودن یعنی چی؟
یعنی کُدی که از قابلیتهای خاص پایتون بهره میبره و خوانا، کوتاه و مفید و با قابلیت حفظ(maintainability) بالاست. یعنی نه تنها کار میکنه و سینتکس به درستی پیاده شده، بلکه از قواعد و عُرف های جامعه پایتون پیروی میکنه و از زبان پایتون، به شیوهی درستش استفاده میکنه.
قبل از هرچیزی باید بگم که این فریموورک کاملا Asyncio رو پشتیبانی میکنه، این کتابخونه توی کارهایی که نیاز به منتظر موندن دارن به ما کمک بزرگی میکنه، که راست کار APIهاست!
این ماژول یجورایی به ما اجازه میده همزمان چند کار انجام بدیم.
چند تا مثال از تسک های io-bound:
یکی از دلایل سرعت خوب این فریموورک استفاده از همین ماژول هست.
از ورژن ۳.۵ پایتون، ویژگیای اضافه شده که میتونید نوع و جنس(type) متغیرها، ورودی و خروجیهاتون در کد رو مشخص کنید. البته این به اصطلاح type hintها در روند اجرای کد هیچ تاثیری ندارن و فقط برای خوانایی بیشتر هستند.
که در این مثال نوع پارامتر name و همچنین خروجی تابع رو به شکل بالا مشخص کردیم.
یکی از خوبیهای این کار کمک به قابلیتهای دیباگ کردن و اتوکامپلیت ادیتورهاست. یعنی قبل از اینکه کد رو اجرا کنیم و بخوایم که مشکل بخوریم، ادیتور من میدونه دارم با چه نوع دادهای کار میکنم و میتونه به من کارهایی که میتونم انجام بدم رو پیشنهاد بده.
اگه دوست دارید بیشتر در مورد type hints بخونید:
حالا فریموورک FastAPI از این ویژگی به همراه pydantic برای ولیدیشنها استفاده میکنه و کار شما رو خیلی خیلی آسون میکنه!
صحت سنجی یا ولیدیشن دیتا، کاریه که این کتابخونه برای شما انجام میده!
این کتابخونه از type annotation های پایتون، که کمی جلوتر درموردشون حرف زدیم استفاده میکنه و فرایند صحت سنجی دیتاها رو براتون به شدت آسون میکنه.
به همین سادگی یک مدل تعریف کرده و نوع دادهها رو مشخص میکنیم. درهنگام اجرا و ساخت یک آبجکت از کلاس Student این کتابخونه مطمئن میشه، دیتاهایی که درونش قرار میگیرن، همون چیزایی هستن که ما مشخص کردیم.
سعی میکنم توی پست بعدیم این کتابخونه رو معرفی کنم تا کمی با خوبیهاش آشنا بشیم.
استانداردهای openAPI (OpenAPI Specification) یک سری رابط خارج از چارچوبِ زبان برای RestAPIها هستند که هم به انسان و هم به کامپیوترها اجازه میدن بدون دیدن سورسکد، قابلیتهای اون API رو بشناسن.
یکی از کارهایی که باهاش میتونید انجام بدید، ساخت خودکار کدهای سمت clientئه!
در اینجا FastAPI برای شما یک رابط کاربری برای تست کردن ای پی آی فراهم میکنه و تقریباً دیگه نیازی به ابزارهایی مثل postman ندارید.
به صورت پیشفرض در FastAPI داکیومنت خودکار به دو صورت ساخته میشه، که در اینجا هم از همون type hints و مدل های pydantic استفاده میشه:
SwaggerUI:
و همچنین ReDoc:
یک سری از چیزهایی که جلوتر گفتیم، مانند type hints و pydantic به ادیتورها کمک میکنن بهتر کاری که ما میخوایم انجام بدیم رو حدس بزنن و به ما پیشنهادهای مفیدی بدن.
این کار خودش تعداد اشتباهات در کد رو کاهش میده و راحت تر میتونیم کد رو دیباگ کنیم.
اگه دوست دارید میتونید لیست کامل تری از قابلیتهای این فریموورک رو از این لینک ببنید.
اینم اضافه کنم که توی پروژهی خودم به دلیل استفاده از SqlAlchemy، از روتهای async استفاده نکردم. ولی بازم FastAPI این قسمت رو مدیریت میکنه و توی عملکرد مشکلی ایجاد نمیشه!
توی ورژن جدید SqlAlchemy، قابلیت Async اضافه میشه و میتونید راحت استفاده کنید. به علاوه، یه جایگزین خوب برای اون هم Tortoise-orm هست که توی پروژههای اخیر استفاده کردم و جوابگو بوده.