چرا FastAPI؟

توی آخرین پروژه‌ای که داشتم - که توسعه بک‌اند(RestAPI) یک وب‌سایت به علاوه یک ربات تلگرامی بود - تصمیم گرفتم که بیخیال فلسک بشم و از فریموورک FastAPI استفاده کنم. الآن که تقریباً به انتهای پروژه رسیدم، تصمیم گرفتم تجربه خودم از این فریموورک رو با شما هم به اشتراک بذارم.همونطور که توی اسم فریموورک هم اومده، از سرعت بالایی برخورداره و توی بنچمارک‌ها نشون داده که دست کمی از فریموورک‌های زبان‌هایی مثل GoLang نداره!منبع عکس بالا و مقاله‌ای با عنوان FastAPI vs Flask رو میتونید از این لینک دنبال کنید.ساخت یک API با این فریموورک به همین سادگیه!از ویژگی‌های خوب این فریموورک که میتونم بهشون اشاره کنم سرعت خوب، نیاز نداشتن به نوشتن کد زیاد، سرعت توسعه بالا و همچنین ساختن داکیومنت خودکار هستن.این فریموورک بر پایه starlette هست و یک سری آپشن فوق‌العاده کاربردی رو به اون اضافه میکنه که جلوتر به چندتاش اشاره میکنم.بهترین چیزی که میتونم راجع بهش بگم اینه که pythonic هست. حالا پایتونیک بودن یعنی چی؟یعنی کُدی که از قابلیت‌های خاص پایتون بهره میبره و خوانا، کوتاه و مفید و با قابلیت حفظ(maintainability) بالاست. یعنی نه تنها کار میکنه و سینتکس به درستی پیاده شده، بلکه از قواعد و ‌عُرف های جامعه پایتون پیروی میکنه و از زبان پایتون، به شیوه‌ی درستش استفاده میکنه.قبل از هرچیزی باید بگم که این فریموورک کاملا Asyncio رو پشتیبانی میکنه، این کتابخونه توی کارهایی که نیاز به منتظر موندن دارن به ما کمک بزرگی میکنه، که راست کار APIهاست!این ماژول یجورایی به ما اجازه میده همزمان چند کار انجام بدیم.چند تا مثال از تسک های io-bound:گرفتن دیتا از یک API خارجی.کوئری زدن به دیتابیس.خوندن از فایل.دریافت دیتا روی شبکه.یکی از دلایل سرعت خوب این فریموورک استفاده از همین ماژول هست.ساپورت برای type hintهای پایتون!از ورژن ۳.۵ پایتون، ویژگی‌ای اضافه شده که میتونید نوع و جنس(type) متغیر‌ها، ورودی و خروجی‌هاتون در کد رو مشخص کنید. البته این به اصطلاح type hintها در روند اجرای کد هیچ تاثیری ندارن و فقط برای خوانایی بیشتر هستند.یک مثال برای type hintsکه در این مثال نوع پارامتر name و همچنین خروجی تابع رو به شکل بالا مشخص کردیم.یکی از خوبی‌های این کار کمک به قابلیت‌های دیباگ کردن و اتوکامپلیت ادیتورهاست. یعنی قبل از اینکه کد رو اجرا کنیم و بخوایم که مشکل بخوریم، ادیتور من میدونه دارم با چه نوع داده‌ای کار میکنم و میتونه به من کارهایی که میتونم انجام بدم رو پیشنهاد بده.اگه دوست دارید بیشتر در مورد type hints بخونید: https://virgool.io/@Mhs/%D8%A7%D8%AD%D8%AA%D9%85%D8%A7%D9%84%D8%A7-%D8%B4%D9%85%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%A8%D9%84%D8%AF-%D9%86%DB%8C%D8%B3%D8%AA%DB%8C%D8%AF-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-vdtinqpllywd حالا فریموورک FastAPI از این ویژگی به همراه pydantic برای ولیدیشن‌ها استفاده میکنه و کار شما رو خیلی خیلی آسون میکنه!استفاده از pydantic برای صحت سنجی دیتاها.صحت سنجی یا ولیدیشن دیتا، کاریه که این کتابخونه برای شما انجام میده!این کتابخونه از type annotation های پایتون، که کمی جلوتر درموردشون حرف زدیم استفاده میکنه و فرایند صحت سنجی دیتاها رو براتون به شدت آسون میکنه.به همین سادگی یک مدل تعریف کرده و نوع داده‌ها رو مشخص میکنیم. درهنگام اجرا و ساخت یک آبجکت از کلاس Student این کتابخونه مطمئن میشه، دیتاهایی که درونش قرار میگیرن، همون چیزایی هستن که ما مشخص کردیم.سعی میکنم توی پست بعدیم این کتابخونه رو معرفی کنم تا کمی با خوبی‌هاش آشنا بشیم.ساپورت برای استاندارد‌های OpenAPI و ساخت داکیومنت خودکار با SwaggerUI و ReDoc.استانداردهای openAPI (OpenAPI Specification) یک سری رابط خارج از چارچوبِ زبان برای RestAPIها هستند که هم به انسان و هم به کامپیوترها اجازه میدن بدون دیدن سورس‌کد، قابلیت‌های اون API رو بشناسن.یکی از کارهایی که باهاش میتونید انجام بدید، ساخت خودکار کدهای سمت clientئه!در اینجا FastAPI برای شما یک رابط کاربری برای تست کردن ای پی آی فراهم میکنه و تقریباً دیگه نیازی به ابزارهایی مثل postman ندارید.به صورت پیشفرض در FastAPI داکیومنت خودکار به دو صورت ساخته میشه، که در اینجا هم از همون type hints و مدل های pydantic استفاده میشه:SwaggerUI:swaggerUIو همچنین ReDoc:ReDocسازگاری بالا با ادیتور‌های کد مانند vscode برای تکمیل خودکار(autocomplete).یک سری از چیزهایی که جلوتر گفتیم، مانند type hints و pydantic به ادیتورها کمک میکنن بهتر کاری که ما میخوایم انجام بدیم رو حدس بزنن و به ما پیشنهادهای مفیدی بدن.این کار خودش تعداد اشتباهات در کد رو کاهش میده و راحت تر میتونیم کد رو دیباگ کنیم.نمونه autocomplete در vscodeاگه دوست دارید میتونید لیست کامل تری از قابلیت‌های این فریموورک رو از این لینک ببنید.اینم اضافه کنم که توی پروژه‌ی خودم به دلیل استفاده از SqlAlchemy، از روت‌های async استفاده نکردم. ولی بازم FastAPI این قسمت رو مدیریت میکنه و توی عملکرد مشکلی ایجاد نمیشه!توی ورژن جدید SqlAlchemy، قابلیت Async اضافه میشه و میتونید راحت استفاده کنید. به علاوه، یه جایگزین خوب برای اون هم Tortoise-orm هست که توی پروژه‌های اخیر استفاده کردم و جوابگو بوده.