آموزش

آموزش FastAPI: مقدمه‌ای بر استفاده از FastAPI

فریم‌ورک FastAPI رو کاوش کن و یاد بگیر چطور می‌تونی ازش برای ساخت API در پایتون استفاده کنی.

تاریخ انتشار:
15 شهریور 1405
پایتون
13 دقیقه
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

رابط‌های API (رابط برنامه‌نویسی اپلیکیشن) ستون فقرات معماری مدرن هستن، چون به برنامه‌ها اجازه می‌دن ماژولار و مستقل باشن. این یعنی می‌تونی برنامه‌ها رو سریع و راحت بسازی و به‌سادگی نگهداری و به‌روزرسانی‌شون کنی.

در یادگیری ماشین هم APIها خیلی مهمن، چون به برنامه‌های مختلف اجازه می‌دن داده‌ها رو با هم به اشتراک بذارن و با هم کار کنن؛ این موضوع باعث صرفه‌جویی در زمان و انرژی می‌شه. فریم‌ورک‌های مختلفی برای ساخت API در پایتون وجود داره که Django، Flask و FastAPI از محبوب‌ترین‌هاشون هستن. این آموزش یک بررسی عمیق از فریم‌ورک FastAPI محسوب می‌شه.

اگه می‌خوای در این مورد بیشتر یاد بگیری، دوره مستقر کردن هوش مصنوعی در پروداکشن با FastAPI در فینکا رو بهت پیشنهاد می‌کنیم.

رابط API چیه؟

کلمه API مخفف Application Programming Interface هست. API مثل یک واسط نرم‌افزاریه که به دو برنامه اجازه می‌ده با هم صحبت کنن. وقتی از یک برنامه در گوشیت استفاده می‌کنی، اون برنامه به اینترنت وصل می‌شه و داده‌ها رو به یک سرور می‌فرسته. سرور هم داده‌ها رو پردازش می‌کنه و به گوشیت برمی‌گردونه. برنامه گوشی داده‌ها رو تفسیر می‌کنه و به شکل خوانا بهت نشون می‌ده.

رابط API مثل یک گارسون در رستورانه. گارسون سفارش تو رو می‌گیره و به آشپزخونه می‌ده. آشپزخونه غذا رو آماده می‌کنه و می‌ده به گارسون. بعد گارسون غذا رو برای تو میاره.

به همین شکل، API هم درخواست رو از یک برنامه می‌گیره و به سرور می‌فرسته. سرور درخواست رو پردازش می‌کنه و داده‌ها رو به برنامه برمی‌گردونه. در نهایت، برنامه داده‌ها رو تفسیر می‌کنه و به کاربر نشون می‌ده.

اگه می‌خوای درباره پایپ‌لاین‌های یادگیری ماشین، APIها و MLOps بیشتر بدونی، می‌تونی آموزش یادگیری ماشین، پایپ‌لاین‌ها، استقرار و MLOps ما رو در فینکا ببینی.

فریم‌ورک FastAPI چیه؟

فریم‌ورک FastAPI یک فریم‌ورک وب با کارایی بالا برای ساخت API با پایتون ۳.۷ به بالاست که بر اساس type hints استاندارد پایتون کار می‌کنه. این فریم‌ورک به توسعه‌دهنده‌ها کمک می‌کنه تا برنامه‌ها رو سریع و بهینه بسازن. FastAPI روی وب سرور Starlette ساخته شده و امکاناتی داره که ساخت برنامه‌های وب رو آسون‌تر می‌کنه؛ امکاناتی مثل اعتبارسنجی خودکار داده‌ها، مدیریت خطا و مستندات تعاملی API.

در این بخش همه این ویژگی‌ها رو یکی‌یکی بررسی می‌کنیم. اول بیا به ویژگی‌های کلیدی که در مستندات اصلی FastAPI بهشون اشاره شده، نگاهی بندازیم.

  • کارایی (Performance): هم‌تراز با NodeJS و زبان Go.
  • سرعت (Speed): سرعت توسعه رو ۲ تا ۳ برابر افزایش می‌ده.
  • سادگی (Easy): پشتیبانی عالی در ادیتورها. تکمیل خودکار کدها. یادگیری و استفاده آسون.
  • پایداری (Robust): کدهای آماده برای پروداکشن همراه با مستندات تعاملی خودکار.
  • مبتنی بر OpenAPI: کاملاً سازگار با OpenAPI و JSON Schema.

نصب FastAPI

فریم‌ورک FastAPI به پایتون ۳.۷ به بالا نیاز داره و با pip نصب می‌شه. تو باید FastAPI و سرور ASGI یعنی uvicorn رو نصب کنی.

ساخت یک API ساده

بیا مستقیم بریم سراغ ساخت یک API کوچیک و ساده. برای این کار از VS Code استفاده می‌کنیم، اما تو می‌تونی از هر ادیتوری که دوست داری استفاده کنی.

(این مثال از مستندات اصلی آورده شده).

حالا در ترمینال، این API رو با دستور زیر اجرا کن:

کلمه main اسم فایل پایتونه و app متغیریه که کلاس FastAPI رو در خودش ذخیره می‌کنه. می‌تونی هر اسمی که دوست داری روشون بذاری. وقتی دستور بالا رو اجرا کنی، در ترمینال چیزی شبیه به این می‌بینی:

به لینکی که در مرورگرت باز می‌شه برو، اگه صفحه‌ای دیدی که نوشته Hello World، یعنی API با موفقیت راه‌اندازی شده و داره کار می‌کنه.

بهت تبریک می‌گم! اولین API خودت رو ساختی.

مستندات تعاملی API

فریم‌ورک FastAPI با استفاده از استاندارد OpenAPI یک schema از تمام APIهات تولید می‌کنه. یک schema یعنی تعریف یا توصیفی از یک چیز؛ نه خود کدی که اون رو اجرا می‌کنه، بلکه فقط یک توصیف انتزاعی. این OpenAPI schema همون چیزیه که به دو سیستم مستندسازی تعاملی در FastAPI قدرت می‌بخشه.

برای دیدن مستندات، کافیه docs/ رو به انتهای آدرس اینترنتی اضافه کنی (مثلاً http://127.0.0.1:8000/docs). این لینک مستندات تعاملی خودکار API رو نشون می‌ده.

برای تست API، روی دکمه Try it out در گوشه بالا سمت راست کلیک کن.

می‌بینی که بدنه پاسخ (response body) یک دیکشنریه. این همون خروجی تابع read_item هست که در main.py تعریف کردیم. همچنین می‌تونی آدرس درخواست http://127.0.0.1:8000/items/1?q=orange رو ببینی. مقادیر 1 و orange ورودی‌های ما به API بودن.

یک سیستم مستندات تعاملی خودکار دیگه هم در FastAPI وجود داره. برای دیدنش به http://127.0.0.1:8000/redoc برو. ظاهرش این شکلیه:

مثال‌های پیشرفته‌تر

موقع ساخت یک API، مسیر (path) همون روت (route) یا اندپوینت (endpoint) درخواست رو مشخص می‌کنه. با این حال، یک انتخاب دیگه هم داریم که همون عملیات (Operation) هست. کلمه operation در اینجا به یکی از متدهای HTTP اشاره داره. با استفاده از یکی (یا چند تا) از این متدها، می‌تونی با هر کدوم از مسیرهای پشتیبانی‌شده در پروتکل HTTP ارتباط برقرار کنی. معمولاً از این موارد استفاده می‌شه:

  • POST: برای ایجاد داده.
  • GET: برای خواندن داده.
  • PUT: برای به‌روزرسانی داده.
  • DELETE: برای حذف داده.
  • و چند مورد پیشرفته دیگه

فریم‌ورک FastAPI از تمام متدهای HTTP پشتیبانی می‌کنه.

این که FastAPI بر اساس type hints در پایتون ساخته شده، یکی دیگه از ویژگی‌های کلیدی این فریم‌ورکه. این ویژگی در پایتون ۳.۶ و بالاتر پشتیبانی می‌شه. در واقع type hints یک دستور خاصه که بهت اجازه می‌ده نوع یک متغیر رو مشخص کنی.

تعیین نوع متغیرها به ادیتورها و ابزارهای دیگه کمک می‌کنه تا راهنمایی‌های بهتری بهت بدن. بیا یک مثال پیشرفته‌تر ببینیم.

ما فایل main.py رو طوری تغییر می‌دیم که شامل یک درخواست PUT جدید بشه که چند ورودی با انواع داده مختلف می‌گیره.

(این مثال از مستندات اصلی آورده شده).

تغییرات:

یک درخواست put اضافه شده که دو ورودی می‌گیره. متغیر item_id یک عدد صحیح (integer) هست و متغیر item به کلاس سفارشی Item اشاره می‌کنه که ایجاد شده و BaseModel رو از pydantic به ارث می‌بره. کلاس Item سه ویژگی داره: name، price و is_offer که همگی انواع داده مختلفی دارن.

فریم‌ورک FastAPI این موارد رو بررسی می‌کنه:

  • متغیر name باید یک str (رشته) باشه.
  • متغیر price باید یک float (اعشاری) باشه.
  • متغیر is_offer در صورت وجود، باید یک متغیر بولی (bool) باشه.

مزیت استفاده از type hints اینه که یک بار نوع پارامترها، بدنه و غیره رو به‌عنوان پارامترهای تابع با استاندارد پایتون (۳.۶ به بالا) مشخص می‌کنی. با این کار از مزایای زیر بهره‌مند می‌شی:

  • پشتیبانی در ادیتور، شامل تکمیل خودکار (auto-completion) و بررسی نوع متغیرها
  • اعتبارسنجی داده‌ها (Data Validation)
  • تبدیل داده‌های ورودی
  • تبدیل داده‌های خروجی
  • خطاهایی که درک‌شون آسونه.

مقایسه FastAPI با Django و Flask

هر سه این فریم‌ورک‌ها برای ساخت برنامه‌های وب با پایتون استفاده می‌شن. هر کدوم نقاط قوت و ضعف خودشون رو دارن.

فریم‌ورک Django یک ابزار کامل هست که همه‌چیزهایی که برای شروع نیاز داری رو شامل می‌شه، مثل یک ORM داخلی و پنل ادمین. ممکنه برای مبتدی‌ها کمی پیچیده باشه، اما مستندات کاملش یادگیری رو راحت می‌کنه.

فریم‌ورک Flask یک میکروفریم‌ورک هست که سبکه و شروع کار باهاش آسونه. به اندازه Django امکانات نداره، اما برای پروژه‌های ساده عالیه.

فریم‌ورک FastAPI یک ابزار جدیده که طوری طراحی شده تا سریع و آسون باشه. امکاناتی مثل اعتبارسنجی خودکار داده‌ها و مستندسازی رو هم شامل می‌شه.

 

Django

Flask

FastAPI

کامیونیتی

بزرگ.

۶۶ هزار ستاره گیت‌هاب

بزرگ.

۶۱ هزار ستاره گیت‌هاب

بزرگ.

۵۰ هزار ستاره گیت‌هاب

عملکرد (Performance)

بسیار بزرگه و از نظر سرعت بهترین نیست.

یک میکرو فریم‌ورک وب هست و عملکرد بهتری نسبت به Django داره.

یکی از سریع‌ترین فریم‌ورک‌های وب با پشتیبانی داخلی از async هست که به کاراییش اضافه می‌کنه.

پشتیبانی از Async

بله، با تأخیر محدود.

خیر.

به Asyncio نیاز داره

پشتیبانی داخلی از async داره.

راحتی استفاده

فریم‌ورک Django خیلی گسترده‌ست و یادگیریش کمی پیچیده‌ست.

فریم‌ورک Flask برای یادگیری آسونه و استفاده ازش سرراسته.

فریم‌ورک FastAPI از هر سه ساده‌تره.

مستندات تعاملی

تعاملی نیست

خیر

بله (OpenAI، Redoc)

اعتبارسنجی داده

خیر

خیر

بله

 

بنچمارک‌های عملکرد FastAPI

طبق نتایج تست‌های اجراشده توسط techempower، فریم‌ورک FastAPI از نظر عملکرد کلی بر همه فریم‌ورک‌های دیگه برتری داره.

مثال: ساخت یک پایپ‌لاین کامل یادگیری ماشین با PyCaret و استقرار اون با FastAPI

در این بخش، ما به‌سرعت یک پایپ‌لاین یادگیری ماشین می‌سازیم و بعد یک API ایجاد می‌کنیم تا مدل رو ارائه بدیم. برای این کار از کتابخونه کم‌کد (low-code) پایتون به اسم PyCaret استفاده می‌کنیم تا پایپ‌لاین رو بسازیم و API رو ایجاد کنیم. کتابخونه PyCaret با FastAPI یکپارچه شده که این کار ساخت و ارائه مدل‌های یادگیری ماشین رو به‌صورت API بی‌نهایت راحت می‌کنه.

کتابخونه PyCaret

کتابخونه PyCaret یک کتابخونه منبع‌باز و کم‌کد برای یادگیری ماشین در پایتونه که جریان‌های کاری (workflows) یادگیری ماشین رو خودکار می‌کنه. این ابزار، یک پلتفرم کامل و انتها‌به‌انتها برای یادگیری ماشین و مدیریت مدل‌هاست که سرعت چرخه آزمایش‌ها رو به‌شدت بالا می‌بره و باعث می‌شه کارهات رو سریع‌تر انجام بدی.

در این مثال از دیتاست insurance استفاده می‌کنیم. این یک مدل رگرسیون (regression) برای پیش‌بینی هزینه‌های پزشکی بر اساس سن (age)، جنسیت (gender)، شاخص توده بدنی (BMI) و منطقه (region) هست.

خروجی
   age  gender     bmi  children smoker     region      charges
0   19  female  27.900         0    yes  southwest  16884.92400
1   18    male  33.770         1     no  southeast   1725.55230
2   28    male  33.000         3     no  southeast   4449.46200
3   33    male  22.705         0     no  northwest  21984.47061
4   32    male  28.880         0     no  northwest   3866.85520

حالا تابع setup رو از pycaret راه‌اندازی می‌کنیم. این تابع، فرایند آزمایش رو در PyCaret مقداردهی می‌کنه و پایپ‌لاین پردازشی رو بر اساس تمام پارامترهایی که به تابع داده شده، می‌سازه.

تابع setup باید قبل از هر تابع دیگه‌ای اجرا بشه. برای کار کردن، به دو پارامتر data و target نیاز داره. تمام پارامترهای دیگه در setup اختیاری هستن. این تابع وظیفه کنترل تمام مراحل پیش‌پردازش داده‌ها رو بر عهده داره. برای اینکه لیست کاملی از روش‌های پیش‌پردازش پشتیبانی‌شده در PyCaret رو ببینی، یه سر به مستندات PyCaret بزن.

خروجی
                       Description       Value
0                       session_id        1350
1                           Target     charges
2                    Original Data   (1338, 7)
3                   Missing Values       False
4                 Numeric Features           2
5             Categorical Features           4
6                 Ordinal Features       False
7        High Cardinality Features       False
8          High Cardinality Method        None
9            Transformed Train Set   (936, 14)
10            Transformed Test Set   (402, 14)
11              Shuffle Train-Test        True
12             Stratify Train-Test       False
13                  Fold Generator       KFold
14                     Fold Number          10
15                        CPU Jobs          -1
16                         Use GPU       False
17                  Log Experiment       False

وقتی مرحله راه‌اندازی تموم شد، می‌تونیم با اجرای یک خط کد یعنی compare_models، آموزش و انتخاب مدل رو شروع کنیم. با استفاده از اعتبارسنجی متقابل (cross-validation)، این تابع تمام مدل‌های موجود در کتابخونه رو آموزش می‌ده و عملکردشون رو ارزیابی می‌کنه. خروجی این تابع یک جدول امتیازدهی هست که شامل میانگین امتیازهای به‌دست‌اومده از اعتبارسنجی متقاطع می‌شه.

با توجه به این نتایج، بهترین مدل ارزیابی‌شده Gradient Boosting Regressor هست. اگه بخوایم، می‌تونیم مدل رو از طریق مصورسازی‌ها تحلیل کنیم و با تنظیم هایپرپارامترها (hyperparameter tuning) یا ترکیب مدل‌ها (model ensembling) عملکردش رو بهبود بدیم، اما در این آموزش وارد این بخش نمی‌شیم.

ما مستقیم می‌ریم سراغ ساخت API برای بهترین مدل تا بتونیم با استفاده از FastAPI، پیش‌بینی‌ها رو در محیط پروداکشن ارائه بدیم. یادت نره که PyCaret با FastAPI سازگاره، بنابراین می‌تونه با تابع create_api به‌طور خودکار یک REST API از مدل بسازه.

خروجی
API sucessfully created. This function only creates a POST API, it doesn't run it automatically.

To run your API, please run this command --> !python insurance_prediction_model.py

حالا برای اجرای این API، ترمینال رو باز کن و به همون پوشه‌ای که نوت‌بوکت قرار داره برو و این دستور رو اجرا کن:

حالا به آدرس http://127.0.0.1:8000/docs برو و همون رابط کاربری‌ای رو می‌بینی که قبلاً در این آموزش دیده بودی.

همچنین با رفتن به آدرس http://127.0.0.1:8000/redoc می‌تونی مستندات تعاملی جایگزین رو ببینی.

یادت باشه که هم مستندات پیش‌فرض و هم مستندات redoc، با استفاده از استانداردهای OpenAPI ایجاد می‌شن.

اگه می‌خوای فایلی که PyCaret با تابع create_api ساخته رو ببینی، می‌تونی فایل رو در همون پوشه نوت‌بوکت پیدا کنی. این شکلیه:

نتیجه‌گیری

در این مقاله در مورد مفهوم API و اینکه چرا ازش استفاده می‌شه، صحبت کردیم. رابط‌های API در معماری مدرن اهمیت زیادی دارن، چون به برنامه‌های مختلف اجازه می‌دن داده‌ها و قابلیت‌هاشون رو به اشتراک بذارن. این موضوع ساخت سیستم‌های پیچیده‌ای رو ممکن می‌کنه که قابل‌اطمینان‌تر هستن و نگهداری‌شون آسون‌تره.

در ادامه، فریم‌ورک نسبتاً جدیدی در پایتون به اسم FastAPI رو بررسی کردیم. FastAPI یک ابزار جدیده که طوری طراحی شده تا استفاده ازش آسون و در عین حال کارآمد باشه. این فریم‌ورک برای توسعه‌دهنده‌هایی که می‌خوان خیلی سریع و راحت یک API بسازن، انتخاب عالیه.

اگه هم می‌خوای یاد بگیری چطور می‌تونی با استفاده از Flask یک API ساده از یک مدل یادگیری ماشین در پایتون بسازی، این آموزش ساده و کاربردی رو از دست نده:

آموزش  تبدیل مدل‌های یادگیری ماشین به API در پایتون.

اشتراک‌گذاری
فهرست مطالب
  • رابط API چیه؟
  • فریم‌ورک FastAPI چیه؟
  • مقایسه FastAPI با Django و Flask
  • مثال: ساخت یک پایپ‌لاین کامل یادگیری ماشین با PyCaret و استقرار اون با FastAPI
  • نتیجه‌گیری

سوالات متداول در مورد FastAPI

بله، فریم‌ورک FastAPI به‌طور پیش‌فرض با استفاده از کلمات کلیدی async/await در پایتون، از کدهای ناهمگام پشتیبانی می‌کنه.

بله، FastAPI کاملاً برای محیط پروداکشن مناسبه و مستندات عالی، پشتیبانی خوب و رابط کاربری ساده‌ای داره.

فریم‌ورک FastAPI از فراخوانی‌های ناهمگام پشتیبانی می‌کنه. این فریم‌ورک نسبت به Flask سبک‌تر و سریع‌تره و یادگیریش هم آسون‌تره. البته هر دو فریم‌ورک کامیونیتی‌های بزرگی دارن.

نه، FastAPI سرور داخلی نداره. برای این کار باید از uvicorn استفاده کنی.

نه، FastAPI فقط برای پایتون ۳.۶ به بالا در دسترسه.

بله.

نه. طبق گفته techempower، فریم‌ورک Golang Fiber پنجاهمین API سریع در جهانه، در حالی که FastAPI در رتبه ۱۸۳ قرار داره.

فریم‌ورک FastAPI کاملاً با Pydantic سازگاره (و اصلاً بر پایه اون ساخته شده).

دریافت اپلیکیشن فینکا

با اپلیکیشن فینکا، به بیشتر دوره‌ها و مسیرها روی موبایل دسترسی دارید، تمرین می‌کنید و یادگیری رو هم‌زمان روی موبایل و دسکتاپ ادامه می‌دید.