FastAPI چیست؟ – آموزش از صفر برای ساخت API

۱۹
۱۴۰۵/۰۷/۱۴
۲۳ دقیقه
PDF
آموزش متنی جامع

«FastAPI» یکی از فریم‌ورک‌های مدرن پایتون است که برای ساخت سریع و ساده «API» و اپلیکیشن‌های بک‌اند به کار برده می‌شود. از زمان ورود پایتون به حوزه توسعه سمت سرور، محبوبیت آن به شدت افزایش یافت. پایتون اکنون با فناوری‌های قدیمی‌تر و شناخته‌شده‌ای مانند «PHP» و «NET.» در طراحی بک‌اند سایت و وب‌اپلیکیشن‌ها رقابت می‌کند. ترکیب سادگی و قدرت پایتون باعث شده‌اند که فرایند توسعه برای برنامه‌نویسان ساده‌تر و کارآمدتر شود. یکی از مهم‌ترین ابزارها برای ایجاد این ترکیب (سادگی و قدرت) فریم‌ورک FastAPI است. دانستن اینکه FastAPI چیست و چطور باید از آن استفاده کرد، کمک می‌کند به شکل خیلی حرفه‌ای‌تری با API-ها کار کنیم.

آنچه در این مطلب می‌آموزید:
  • با فریم‌ورک FastAPI و کاربردهای آن در توسعه API آشنا می‌شوید.
  • نحوه ساخت نقاط پایانی و مدیریت درخواست‌ها را در FastAPI یاد می‌گیرید.
  • روش مدیریت پارامترهای مسیر، استعلام، بدنه، هدر و کوکی را بررسی می‌کنید.
  • نحوه ساخت REST API با پایگاه داده و احراز هویت را می‌آموزید.
  • روش مدیریت خطاها و بهینه‌سازی عملکرد FastAPI را یاد می‌گیرید.
  • تفاوت FastAPI با فریم‌ورک‌های Django و Flask و Pyramid را مقایسه می‌کنید.
FastAPI چیست؟ – آموزش از صفر برای ساخت API
فهرست مطالب این نوشته
997696

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

FastAPI چیست؟

فریمورک مدرن FastAPI با این هدف طراحی شده است که برنامه نویسی «بک اند» (Back End)، وب‌اپلیکیشن‌ها و ساخت API با پایتون را ساده‌تر کند. کدهای نوشته شده با فریم‌ورک FastAPI علاوه بر سرعت و سادگی، کیفیت و عملکرد بالایی هم دارند.

در فهرست پایین، چند مورد از مهم‌ترین ویژگی‌های FastAPI را توضیح داده‌ایم.

  • قدرتمند و دقیق: FastAPI بر پایه کتابخانه‌های «Starlette» و «Pydantic» ساخته شده است.
  • کیفیت بالا: کیفیت بسیار بالایی دارد و می‌تواند داده‌ها را به شکل قابل اعتمادی مدیریت کند.
  • کاربرد گسترده‌: در حوزه توسعه REST API، میکروسرویس‌ها و سیستم‌های بک‌اند برای وب‌ و اپلیکیشن‌های موبایل کاربرد دارد.
  • سادگی: سینتکس ساده و کاربر پسندی دارد.
چند مورد از مهم‌ترین ویژگی‌های FastAPI
چند مورد از مهم‌ترین ویژگی‌های FastAPI

فریم‌ورک‌های مختلفی مانند «جنگو» (Django) و «فلسک» (Flask) با هدف ساخت «واسط‌های برنامه‌نویسی کاربردی وب» (Web API) توسعه یافته‌اند. بااین‌حال، سرعت همچنان یکی از چالش‌های مهم در توسعه وب با پایتون بود. به همین دلیل، فریم‌ورک دیگری به نام FastAPI برای پایتون ایجاد شد که هدف آن بهبود عملکرد و رفع بخشی از این محدودیت‌هاست.

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

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

برای نصب اپلیکیشن رایگان مجله فرادرس، کلیک کنید.

روش شروع به کار با FastAPI چیست؟

راه‌اندازی پروژه با FastAPI ساده است و در چند مرحله کوتاه انجام می‌شود.

  1. ابتدا، مانند هر پروژه پایتونی دیگری، بهتر است که محیط مجازی ایجاد کنیم.
  2. سپس بسته‌های «FastAPI» و «Uvicorn» را نصب می‌کنیم.

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

python -m pip install fastapi 'uvicorn[standard]'
بعد از اجرای دستور بالا به راحتی می‌توانیم «نقاط پایانی» (Endpoints) مورد نیاز اپلیکیشن خود را ایجاد کنیم.

وجود پکیج‌های fastapi  و uvicorn  برای راه‌اندازی پروژه‌های FastAPI ضروری است.

  • uvicorn: این پکیج همان سروری را می‌سازد که پروژه FastAPI بر روی آن می‌شود.
  • fastapi: این پکیج هم متد‌ها و پیکربندی‌های مورد نیاز برای ساخت نقاط پایانی API-ها را ایجاد می‌کند.
لوگو‌های FastAPI و پایتون برای ساخت API

ساخت اولین روت

برای ساخت اولین روت fastapi  با همان روش پایتونی همیشگی شروع می‌کنیم. یعنی اول از همه فایلی با نام «main.py» می‌سازیم که تمام کدهای پروژه را در آن بنویسیم. فایل را در ویرایشگر کد خود باز کرده و دستورات زیر را داخل آن می‌نویسیم.

نکته: برای نوشتن مثال‌های این مطلب از ویرایشگر کد ویژوال استودیو کد استفاده می‌کنیم. اما شما می‌توانید با هر ویرایشگر دیگری مانند پیرامید، «پای‌چارم» (PyCharm) و غیره کار کنید. نوع ویرایشگر در کدها، پکیج‌ها و سینتکس برنامه هیچ تاثیری ندارد.

  1. در خط اول تکه کد بالا، ابتدا کلاس FastAPI  را از ماژول fastapi  به محیط کدنویسی وارد می‌کنیم.
  2. سپس شیئی به نام fastapi  از روی این کلاس می‌سازیم.
  3. از این به بعد می‌توانیم از شی ساخته شده از روی کلاس FastAPI  به صورت دکوراتور استفاده کنیم.

این دکوراتور برای توابعی به کار می‌رود که با هدف ساخت نقاط پایانی طراحی شده‌اند. با استفاده از این روش، می‌توان دستورات اصلی REST API مانند PUT  و DELETE  و PATCH  و GET  و POST  را به کار برد و مسیر منبع را نیز تنظیم کرد.

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

uvicorn main:fastapi --reload
در دستور بالا، عبارت main  نشان دهنده همان ماژولی است که کدهای برنامه در آن قرار دارد. fastapi  همان نمونه‌ای است که از روی کلاس FastAPI  ساخته‌ایم.

این دستور سرور را اجرا می‌کند. سپس از طریق مرورگر و با مراجعه به آدرس http://127.0.0.1:8000  می‌توانید به برنامه ساخته شده دسترسی داشته باشید.

  • نکته ۱: باید این دستور را دقیقا در همان دایرکتوری اجرا کنید که فایل main.py در آن قرار دارد. ساده‌ترین روش، باز کردن ترمینال در همان صفحه پروژه در ویژوال استودیو کد است. اما اگر از خط فرمان ویندوز استفاده می‌کنید، ابتدا به دایرکتوری حاوی فایل main.py بروید.
  • نکته ۲: شاید ویندوز بعد از نصب uvicorn  موفق به پیدا کردن آن نشد و خطای زیر داده شد:
'uvicorn' is not recognized as an internal or external command,
operable program or batch file.
در این حالت از دستور پایین برای اجرای پروژه استفاده کنید:
python -m uvicorn main:fastapi --reload
برای ساخت روت بعدی فقط کافیست که از تابع هندلر استفاده کنیم. در مثال زیر، نام این تابع را هم handler()  گذاشته‌ایم.

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

با اضافه شدن این دکوریتور به تابع، بلوک کد از تابع به نقطه پایانی API تبدیل می‌شود.

برای ساخت نقاط پایانی مختلف می‌توانیم از دکوریتور‌های زیر استفاده کنیم.

  • @fastapi.post
  • @fastapi.put
  • @fastapi.patch
  • @fastapi.delete
دکوریتور‌های اصلی FastAPI برای ساخت «نقطه پایانی» (Endpoint)
دکوریتور‌های اصلی FastAPI برای ساخت «نقطه پایانی» (Endpoint)

چطور پایتون را در فرادرس یاد بگیریم؟

فرادرس، محتوای آموزشی بسیار متنوع و کاملی را با هدف کمک به یادگیری کامل پایتون، منتشر کرده است. این محتوا در دو بخش (یعنی مطالب متنی و فیلم‌های آموزشی) تشکیل شده است. به منظور دسترسی به مطالب علمی می‌توانید از مجله فرادرس کمک بگیرید. اما برای استفاده از فیلم‌های آموزشی باید به وب‌سایت فرادرس مراجعه کنید. در این وب‌سایت، فیلم‌های آموزشی بسیار کامل و حرفه‌ای را پیدا می‌کنید. این فیلم‌ها به وسیله اساتید باتجربه و حرفه‌ای تهیه شده‌اند. هر کدام از فیلم‌های آموزشی فرادرس که به حساب کاربری اضافه شوند، برای همیشه در دسترس خواهند بود.

مجموعه آموزش برنامه نویسی پایتون Python – مقدماتی تا پیشرفته
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه فیلم‌های آموزش برنامه نویسی پایتون Python از مقدماتی تا پیشرفته هدایت شوید.

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

در پایین، چند مورد از فیلم‌های آموزش پایتون را نام برده‌ایم. این فیلم‌ها برای آموزش سطوح مبتدی تا پیشرفته‌ پایتون مفید هستند.

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

روش افزودن اطلاعات به درخواست‌ها در FastAPI چیست؟

در این بخش از مطلب، توضیح داده‌ایم که روش افزودن اطلاعات به درخواست‌ها و دریافت اطلاعات موجود در پاسخ‌ها با استفاده از FastAPI چیست. ارسال و دریافت داده‌ها از «نقطه پایانی» (Endpoint)، جزو مهم‌ترین قسمت‌ها در توسعه API است. برای ارسال داده به نقطه پایانی می‌توان از روش‌های مختلفی استفاده کرد. در فهرست پایین بعضی از مهم‌ترین روش‌های انجام این کار را نام برده‌ایم.

  • استفاده از «پارامترهای مسیر» (Path Parameters)
  • استفاده از «پارامترهای پرس‌وجو» (Query Parameters)
  • کار با «پارامتر‌های بدنه» (Body Parameters)
  • کار با «هدرها» (Headers) و «کوکی‌ها» (Cookies)
روش ارسال دادهمحل قرارگیری دادهکاربرد
پارامتر مسیرمسیر URLارسال داده‌های کوتاه
پارامتر پرس‌وجوبعد از ?  در URLارسال داده با ساختار key=value
پارامتر بدنهبدنه درخواستارسال داده‌های ساختاریافته
هدرهدر درخواستارسال اطلاعات بیشتر درباره محتوا
کوکیبخش کوکی درخواستارسال اطلاعاتی مانند session_token

در ادامه این بخش تمام تکنیک‌های بالا را یک به یک همراه با مثال‌های ساده‌ای بررسی می‌کنیم.

مهم‌ترین پارامتر‌های موجود در هر درخواست و پاسخ
مهم‌ترین پارامتر‌های موجود در هر درخواست و پاسخ

روش کار با پارامترهای مسیر در FastAPI چیست؟

در این روش، داده‌های کوتاه به صورت مستقیم به مسیر «آدرس وب» (URL) اضافه می‌شوند. برای استفاده از این قابلیت در نقاط پایانی FastAPI، می‌توانید از نمونه زیر استفاده کنید.

در این مثال، name، پارامتر مسیر است. مقدار آن از آدرس وب دریافت شده و به‌عنوان پارامتر به تابع get_name  ارسال می‌شود. در نتیجه، به‌سادگی می‌توان به داده‌ی ارسال شده از طریق مسیر آدرس، دسترسی داشت.

روش کار با پارامترهای پرس‌وجو در FastAPI چیست؟

«پارامترهای پرس‌وجو» (Query Parameters) مانند پارامترهای مسیر (با هدف ارسال داده به نقطه پایانی) استفاده می‌شوند، اما در بخش متفاوتی از URL قرار می‌گیرند. این پارامترها بعد از علامت سوال (?) در آدرس وب قرار می‌گیرند.

ساخت URL به کمک پایتون - FastAPI چیست

برای استفاده از آن‌ها در fastapi، می‌توانید از نمونه زیر استفاده کنید.

در این مثال، skip  و limit  پارامترهای پرس‌وجو هستند. این پارامترها بعد از مسیر نقطه پایانی (/ ) و به صورت جفت‌های key=value  در URL قرار می‌گیرند. مقدار پیش‌فرض skip  برابر 0 و مقدار پیش‌فرض limit  برابر 10 است. با وارد کردن مقادیر متفاوت در URL می‌توان این مقادیر را تغییر داد.

روش استفاده از پارامترهای بدنه در FastAPI چیست؟

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

در مثال بالا کلاس Item  را تعریف کرده‌ایم. این کلاس از کلاس BaseModel  ارث‌بری می‌کند. کلاس BaseModel  (در خط اول) از درون ماژول Pydantic  به محیط برنامه نویسی وارد شده است. BaseModel تمام پارامتر‌های بدنه درخواست‌ها را فراهم می‌کند و اطلاعات بیشتری درباره این پارامتر‌ها به fastapi  می‌دهد.

روش افزودن اطلاعات به هدرها و کوکی‌ها در FastAPI چیست؟

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

ابتدا روش دریافت اطلاعات با کمک «هدر‌ها» (Headers) را بررسی می‌کنیم.

در مثال بالا، پارامتر user_agent  مقدار Header(None)  را به عنوان پیش‌فرض دارد. این عبارت به fastapi  می‌گوید که مقداری را از هدر درخواست ارسال شده، دریافت کند. حالا اگر داخل درخواست فعلی، هدر وجود داشت، متغیر user_agent  مقدار خود را از هدر دریافت می‌کند. در غیر این صورت، مقدار متغیر user_agent  برابر با None  قرار می‌گیرد.

در کادر زیر هم روش دریافت اطلاعات با کمک «کوکی‌ها»‌ (Cookies) را بررسی می‌کنیم.

در مثال بالا هم مانند مثال قبلی پارامتری با مقدار پیش‌فرض ساخته‌ایم. این بار، نام پارامتر session_token  بوده و مقدار پیش‌فرض برابر با Cookie(None)  است. عبارت session_token: str = Cookie(None) به fastapi  می‌گوید که داده‌های موجود در بخش کوکی‌های درخواست رسیده را دریافت کند و در پارامتر session_token  قرار بدهد. اگر درخواست رسیده هیچ کوکی نداشته باشد، مقدار پارامتر session_token  برابر با None  خواهد شد.

نمایش مستندات مربوط به API

وقتی که سرور در حال اجرا است، در مرورگر به آدرس http://127.0.0.1:8000/docs بروید.

نمایش مستندات مربوط به API

در این آدرس تمام API-ها و نقاط پایانی مربوط به آن‌ها همراه با توضیحات کامل قرار داده شده‌‌اند. در واقع با کمک این آدرس به مستندات کامل API-های خود دسترسی دارید. در قسمت بعد روش استفاده از FastAPI را در پروژه واقعی بررسی می‌کنیم.

پروژه عملی برای ساخت REST API

در این قسمت از مطلب می‌خواهیم با کمک پیاده‌سازی REST API در پروژه کاربردی به درک بهتری از FastAPI برسیم. به منظور نمایش قدرت FastAPI، می‌خواهیم برای اپلیکیشن فرضی ذخیره داده (عکس) REST API بسازیم. این API باید بتواند به پایگاه داده متصل شود، از عملیات بارگذاری عکس‌ها پشتیبانی کند و روت‌های امنی داشته باشد.

API مورد نظر باید اندپوینت‌ها یا نقاط پایانی زیر را داشته باشد.

  • GET /items: این نقطه پایانی برای دستیابی به تمام آیتم‌های ذخیره شده در سرور به کار برده شود.
  • GET /items/{item_id}: با این مسیر باید بتوانیم آیتم مشخصی را از سرور بدست بیارویم.
  • POST /items: از این نقطه پایانی برای اضافه کردن آیتم جدید به سرور استفاده کنیم.
  • PATCH /items/{item_id}: با کمک این نقطه پایانی باید بتوانیم آیتم مشخص شده و موجود در سرور را به‌روزرسانی کنیم.
  • DELETE /items/{item_id}: این نقطه پایانی هم باید برای حذف آیتم مشخصی در سرور به کار برده شود.

سپس می‌توانیم نقاط پایانی بیشتری هم برای مدیریت فایل‌ها بسازیم. همچنین پایگاه داده و نوع خاصی از سازوکار احراز هویت را پیاده‌سازی می‌کنیم. این سیستم احراز هویت با استفاده از «میان‌افزار» (Middleware) بر روی بعضی از نقاط پایانی اجرا خواهد شد.

پیش‌نیاز‌های اجرای پروژه

برای اجرای این پروژه باید حداقل دانش قابل قبول را درباره کار با موارد زیر داشته باشید.

  • پایتون
  • «HTTP» و «JSON» و «REST API» و محیط مجازی پایتون
  • کار با ترمینال

در ضمن به پایتون نسخه ۳.۱۰ هم به صورت نصب شده در کامپیوتر نیاز داریم.

تنظیمات اولیه پروژه

مراحل مربوط به تنظیمات اولیه پروژه را در فهرست پایین نوشته‌ایم.

  1. قبل از هر کاری محیط مجازی پایتون را بر روی دایرکتوری هدف بسازید و فعال کنید.
  2. بعد از فعال کردن محیط مجازی دایرکتوری «src» را در کنار فولدر مربوط به این محیط بسازید. تمام کدهای خود را داخل این دایرکتوری می‌نویسیم.
  3. سپس دایرکتوری را با استفاده از ویرایشگر کد خود باز کنید. ظاهر داریکتوری‌ها در ویرایشگر کد مانند تصویر زیر خواهد بود.
نمونه‌ای از دایرکتوری‌های درون وی اس کد

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

نصب وابستگی‌ها

برای اجرای این پروژه به نصب وابستگی‌های ضروری مانند uvicorn  و fastapi  احتیاج داریم. هر چند با اضافه کردن اتصال به پایگاه داده و سیستم بارگذاری عکس در این پروژه می‌خواهیم توانایی‌های سرور را ارتقا بدهیم. بنابراین به وابستگی‌های دیگری هم نیاز خواهیم داشت. برای مثال، پایگاه داده مناسب و SQLAlchemy را هم باید نصب کنیم.

با هدف نصب وابستگی‌های مورد نیاز این پروژه، دستور زیر را در خط فرمان نوشته و دکمه Enter را فشار دهید.

pip install 'fastapi[all]' 'uvicorn[standard]' databases sqlalchemy
با اجرای دستور بالا تمام وابستگی‌های ضروری برای این پروژه در محیط مجازی نصب می‌شود.

نکته: این دستور مربوط به محیط لینوکس و MacOS است. در صورت کار با ویندوز باید کاراکتر‌های کوتیشن را از دستور حذف کنید.

ساخت نقاط پایانی مورد نظر

ابتدا وارد دایرکتوری src بشوید. سپس فایل جدیدی به نام main.py در این دایرکتوری ایجاد کنید. این کار را به عنوان نقطه شروعی برای پیاده‌سازی پروژه در نظر بگیرید. البته به غیر از کار با این فریم‌ورک، روش‌های مختلفی برای ساخت API با پایتون وجود دارد. در صورت تمایل به آشنایی با این روش‌ها پیشنهاد می‌کنیم که مطلب مربوط به این مسئله را در مجله فرادرس مطالعه کنید.

اکنون کدهای زیر را در فایل main.py بنویسید (یا از همین‌جا کپی و پیست کنید.).

در تکه کدهای بالا ۵ هندلر برای نقاط پایانی تعریف کرده‌ایم.

  1. ابتدا انبار محلی با نام inventory  برای ذخیره تمام آیتم‌های اضافه شده می‌سازیم.
  2. از کلاس ItemUpdate برای مشخص کردن اطلاعاتی استفاده می‌کنیم که در بدنه درخواست PATCH به endpoint ارسال می‌شوند. می‌توان از این کلاس برای تعریف پارامتر‌های اختیاری هم استفاده کرد.
  3. کلاس Optional  را از ماژول typing  و کلاس Field  را از pydantic  وارد کرده‌ایم. با کمک این کلاس‌ها می‌توانیم فیلدهای اختیاری بسازیم.
لوگو‌ FastAPI در کنار لوگوی پایتون در حال طی مسیر

در ادامه توابع کاربردی را در فایلی به نام «utils.py» قرار خواهیم داد. این فایل را در دایرکتوری src می‌سازیم.

اکنون می‌توانیم سرور را اجرا کرده و تمام نقاط پایانی تعریف شده را با توجه به مستندات API آزمایش کنیم.

روش مدیریت خطا در FastAPI چیست؟

«مدیریت خطا»‌ (Error Handling) در fastapi  بسیار ساده و قابل درک است. fastapi  برای انجام بهتر این کار، کلاس درونی را با نام HTTPException  فراهم کرده است. با کمک این کلاس، هر وقت که بخشی از سیستم به مشکل خورد می‌توانیم پاسخ‌های مناسبی را به سادگی برگردانیم.

مراحل ساخت API با FastAPI بسیار ساده است. اما نکات ریزی مانند همین مدیریت خطا و غیره وجود دارند که با رعایت آن‌ها می‌توانیم محصولی پیشرفته و حرفه‌ای به کاربران ارائه دهیم. برای یادگیری روش کار با این فریم‌ورک پیشنهاد می‌کنیم که فیلم آموزش ساخت وب سرویس API با FastAPI در پایتون، دوره مقدماتی + گواهینامه را در فرادرس مشاهده کنید. به منظور کمک به مخاطبان مجله، لینک دسترسی مستقیم به این فیلم را در پایین نیز قرار داده‌ایم.

در کادر پایین، مثال ساده‌ای را درباره استفاده از کلاس HTTPException  برای مدیریت داده‌های ورودی نامعتبر پیاده‌سازی کرده‌ایم.

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

روش سفارشی سازی پاسخ‌های خطا در FastAPI چیست؟

برنامه نویسان می‌توانند پاسخ‌های خطا را در fastapi  با سلیقه خودشان به شکل سفارشی تغییر بدهند. بیشتر اوقات این کار برای افزودن اطلاعات بیشتر به پاسخ انجام می‌شود.

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

دریافت خطاهای سرور

خطاهای غیر منتظره را می‌توان با کمک هندلر‌های استثنایی زیر مدیریت کرد.

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

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

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

چند مورد از مهم‌ترین روش‌های مربوط به اجرای سریع‌تر پروژه‌های FastAPI را در فهرست پایین نام برده‌ایم.

  • استفاده از کتابخانه‌های آسنکرون یا ناهمگام
  • پیاده‌سازی کش
  • استفاده از سرور‌های توزیع متوازن باز
  • ارتقای بهره‌وری کوئری‌ها
  • فشرده‌سازی Gzip
روش‌های بهینه‌سازی عملکرد در FastAPI چیست
چند مورد از روش‌های بهینه‌سازی عملکرد در FastAPI

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

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

برای پاسخ به درخواست‌های HTTP از کتابخانه‌های «ناهمگام» یا «async» مانند httpx  استفاده کنید. در این صورت انتظار برای پاسخ HTTP بقیه کارها را مسدود نمی‌کند.

پیاده‌سازی کش

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

استفاده از سرور‌های توزیع متوازن باز

سرویس‌های «توزیع متوازن بار» یا همان «لود بالانسر» (Load Balancer) مانند «Nginx» یا «Traefik» را برای مدیریت بیشتر کار‌های مربوط به درخواست‌ها پیکربندی کنید. برای مثال در کادر پایین، نمونه‌ای از فایل پیکربندی Nginx را نوشته‌ایم.

ارتقای بهره‌وری کوئری‌ها

منظور از عبارت «ارتقای بهره‌وری کوئری‌ها» این است که با استفاده از کارهایی مانند اندیس‌گذاری داده‌ها و جلوگیری از واکشی غیرضروری اطلاعات یا داده‌های بدون کاربرد، عملکرد و کارایی کوئری‌های ارسال شده با پایگاه داده را بیشتر کنیم.

فشرده‌سازی Gzip

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

pip install fastapi-compression
بعد از نصب ماژول fastapi-compression  می‌توانیم آن را به محیط کدنویسی خود وارد کنیم.

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

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

مفاهیم پیشرفته در FastAPI

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

برای مثال، در ادامه می‌خواهیم «میان‌افزاری» (Middleware) برای اعتبارسنجی اپلیکیشن ذخیره‌سازی inventory (که در بخش‌های قبل تعریف کردیم) اضافه کنیم. همچنین قابلیت بارگذاری فایل‌ها و اتصال به پایگاه داده را نیز به این اپلیکیشن اضافه خواهیم کرد.

پیاده‌سازی میان افزار تایید هویت

در دنیای استفاده از API-ها، میان‌افزار مانند دریچه یا سوپاپ عمل می‌کند. این ابزارها کاربرد‌های بسیار زیاد و متنوعی دارند. برای مثال می‌توان به محدود‌کردن دسترسی برای بعضی کاربران، افزودن اطلاعات اضافی به درخواست‌ها و غیره اشاره کرد. برای نمایش روش‌ کار این ابزارها، در این بخش می‌خواهیم میان‌افزاری درست کنیم که فقط به کاربرانی با مجوز خاص امکان دسترسی به داده‌ها را می‌دهد. سپس این Middleware را به چند مورد از نقاط پایانی اپلیکیشن ذخیره‌سازی (تعریف شده در بخش بالا) اضافه می‌کنیم.

پایتون و FastAPI بر روی دو مکعب ساده - FastAPI چیست

قبل از هر کاری باید فایل جدیدی با نام middleware.py در دایرکتوری src بسازیم و کدهای زیر را در آن بنویسیم.

در کدهای بالا Middleware-ی با نام authenticate تعریف کرده‌ایم. این میان‌افزار «سیستم تایید هویت» (Authentication) ساده‌ای را پیاده‌سازی می‌کند. برای اضافه کردن میان‌افزار authenticate به هندلر روت مورد نظرمان ابتدا فایل main.py را باز می‌کنیم. اکنون باید محل نقاط پایانی را پیدا کنیم که می‌خواهیم سیستم تایید هویت خود را بر روی آن‌ها فعال کنیم. سپس پارامتر مورد نظر را به صورت زیر به این نقطه پایانی اضافه می‌کنیم.

بعد از اجرای این عملیات، کدهای هندلر باید شبیه به مورد زیر باشند.

نکته: برای اجرای کدهای بالا باید از قبل تابع authenticate  را از فایل middleware.py و Depends  را از فریم‌ورک fastapi  به محیط برنامه نویسی در فایل main.py ایمپورت کرده باشید.

روش یکپارچه‌سازی برنامه با پایگاه داده در FastAPI چیست؟

برای اضافه کردن پایگاه داده به اپلیکیشن inventory  قبل از هر چیزی باید مطمئن شویم که sqlalchemy  و پایگاه داده مورد نظر نصب شده‌اند. سپس فایلی با نام «database.py» در دایرکتوری src ایجاد می‌کنیم. در بالا‌ترین قسمت از این فایل باید ایمپورت‌های مهم و لازم را بنویسیم.

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

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

کدهای بالا پایه‌ای‌ترین پیکربندی‌های پایگاه داده هستند. بعد از نوشتن این کدها باید شی SessionLocal  را از روی کلاس sessionmaker تعریف کنیم. این کدها وظیفه ساخت سشن پایگاه داده را دارند. با هر بار فراخوانی این شی، یکبار سشن ایجاد می‌شود. سپس کلاس Base  را تعریف می‌کنیم. این کلاس هم نقش مدل پایه و اصلی «BaseModel» برای تمام مدل‌های پایگاه داده بازی می‌کند. یعنی تمام مدل‌های بعدی پایگاه داده که تعریف می‌کنیم باید از این مدل ارث‌بری کنند.

اکنون برای انجام وظایف بالا، کدهای زیر را به فایل database.py اضافه می‌کنیم.

در مرحله بعد با اضافه کردن کدهای زیر به فایل، مدلی از پایگاه داده را ایجاد می‌کنیم.

اکنون کارمان در این بخش به پایان رسیده است. برای ادامه کار باید DBItem  و SessionLocal  را از فایل database.py به فایل main.py ایمپورت بکنیم.

پایتون و FastAPI بالای سر لپتاپ و سرور در حال کار هستند. - FastAPI چیست

در ضمن باید توجه کنید که لازم است هندلر‌های روت را هم به همین‌ترتیب به‌روزرسانی کنیم.

در کدهای بالا ابتدا نمونه‌ای از SessionLocal  را برای هر نقطه پایانی ایجاد کرده و سپس از این نمونه برای اجرای کوئری‌های پایگاه داده استفاده می‌کنیم. پس از اجرای کوئری، می‌توانیم تغییرات ایجاد شده را برای ذخیره در پایگاه داده، ثبت کنیم.

روش بارگذاری فایل‌ها در FastAPI چیست؟

با استفاده از fastapi  به راحتی می‌توانیم فایل بر روی اپلیکیشن بارگذاری کنیم. اکنون از API موجود برای نمایش روش بار‌گذاری و ارائه فایل‌ها استفاده خواهیم کرد. قبل از هرکاری باید با اضافه کردن کدهای زیر، DBItem  را در فایل database.py به‌روزرسانی کنیم.

اکنون باید چند ایمپورت مهم در فایل main.py انجام بدهیم.

  • File  و UploadFile  از فایل fastapi
  • کتابخانه OS
  • FileResponse  از کتابخانه starlette.responses

بعد از نوشتن ایمپورت‌های بالا، کدهای زیر را به فایل اضافه کنید:

  • اولین روت هندلری که در کدهای بالا نوشته‌ایم وظیفه به‌روزرسانی فیلد image_src  از آیتم مشخص شده و بارگذاری فایل بر روی سرور را برعهده دارد.
  • دومین روت هندلر، با نام serve_file ، وظیفه دریافت فایل از سرور را برعهده دارد.

یادگیری عملی پایتون با کمک فرادرس

به دلیل شباهت زیاد سینتکس پایتون به زبان انسان، یادگیری آن نسبت به دیگر زبان‌ها آسان‌تر است. بهترین روش برای درک درست مفاهیم پایتون، کار با آن‌ها برای اجرای پروژه‌های واقعی است. بیشتر اوقات در پروژه‌های واقعی از تکنیک‌های متنوع به صورت ترکیبی و در کنار هم استفاده می‌کنیم. از طرف دیگر اجرای پروژه‌های ساده‌ای مانند بررسی چند نمونه سوال حلقه ‎for‎ در پایتون به یادگیری این دستور کمک می‌کند. فرادرس، مجموعه‌ای از فیلم‌های آموزشی را با عنوان «مجموعه آموزش پروژه محور برنامه نویسی پایتون» تولید و منتشر کرده است. در این مجموعه، روش پیاده‌سازی پروژه‌های واقعی و گوناگون آموزش داده شده است.

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

برای مشاهده فیلم‌های بیشتر بر روی تصویر زیر، کلیک کرده و به صفحه اصلی این مجموعه آموزش هدایت شوید.

مجموعه آموزش پروژه محور برنامه نویسی پایتون (Python)
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه فیلم‌های آموزش پروژه محور برنامه نویسی پایتون هدایت شوید.

مقایسه FastAPI با سایر فریمورک‌های پایتون

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

ویژگیFastAPIجنگو - فلسک - Pyramid
عملکردبالا با ASGI و async/awaitمتوسط - متوسط - متوسط
مستندسازی خودکاردارد، با Swagger و OpenAPIندارد - ندارد - ندارد
اتصال به پایگاه دادهنیازمند کتابخانه‌های خارجیفقط جنگو ORM داخلی دارد.
مقیاس‌پذیریبالابالا - متوسط - بالا
یادگیریآسانمتوسط - آسان - متوسط

تفاوت جنگو با FastAPI چیست؟

جنگو یکی از فریمورک‌های پایتون است که برای توسعه کدهای سمت سرور به کار برده می‌شود. فریمورک جنگو مجموعه‌ای از کتابخانه‌ها و ابزارهای مورد نیاز برای پروژه‌های مختلف را در اختیار توسعه‌دهندگان قرار می‌دهد. جنگو قابلیت‌های قدرتمندی مانند «نگاشت شیء-رابطه‌ای» (Object-Relational Mapping | ORM)، سیستم احراز هویت و مسیردهی دارد. به همین دلیل، برای ساخت برنامه‌های وب بزرگ و پیچیده مناسب است.

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

تفاوت فلسک با FastAPI چیست؟

توسعه‌دهندگان پایتون از فریمورک سبک‌وزن فلسک برای ساخت سریع برنامه‌های وب استفاده می‌کنند. این فریمورک، کنترل و انعطاف‌پذیری زیادی در اختیار توسعه‌دهندگان قرار می‌دهد. در نتیجه، آن‌ها می‌توانند ساختار برنامه را بر اساس نیازها و الزامات پروژه تعیین کنند.

FastAPI نیز فریمورکی سبک است، اما بیشتر بر ساخت API-های سریع و مقیاس‌پذیر تمرکز دارد. این فریمورک امکاناتی مانند اعتبارسنجی داده‌ها و مستندسازی خودکار را در اختیار توسعه‌دهندگان قرار می‌دهد. به همین دلیل، برای پروژه‌هایی که سرعت اجرا و توسعه API در آن‌ها اهمیت زیادی دارد، گزینه مناسبی به شمار می‌رود.

تفاوت پیرامید با FastAPI چیست؟

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

مقایسه پیرامید و FastAPI بالای سر کره زمین

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

مزایای استفاده از FastAPI چیست؟

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

  • عملکرد و سرعت: FastAPI با استفاده از کتابخانه‌ها و ابزارهایی مانند «Pydantic» و «ای‌اس‌جی‌ای» (ASGI)، عملکرد بالایی ارائه می‌دهد. همچنین، از آنجا که این فریمورک بر پایه «Starlette» ساخته شده است، از قابلیت‌های برنامه‌نویسی ناهمگام (Async/Await) به خوبی پشتیبانی می‌کند.
  • مقیاس‌پذیری: FastAPI ساختاری ساده و ماژولار دارد. این ویژگی استفاده از Load Balancer-ها را آسان‌تر می‌کند. در نتیجه، توسعه برنامه‌ها و استفاده بهینه از منابع ساده‌تر می‌شود.
  • مستندسازی خودکار: FastAPI از توسعه‌دهندگان می‌خواهد که اجزای مختلف برنامه را به شکل شفاف تعریف کنند. این ویژگی در کنار یکپارچگی با Pydantic، امکان تولید خودکار مستندات API را فراهم می‌کند. FastAPI این مستندات را بر اساس استاندارد «Swagger» ارائه می‌دهد.
  • سهولت در استفاده: FastAPI فریمورک پایتونی است و تمام مزایای زبان پایتون را در اختیار توسعه‌دهندگان قرار می‌دهد. یکی از مهم‌ترین مزیت‌های پایتون هم سادگی در آموزش و استفاده است. علاوه بر این، راه‌اندازی سرور و ساخت «نقاط پایانی» (Endpoints) هم با سهولت بیشتری انجام می‌شود.
  • اعتبارسنجی درخواست‌ها: FastAPI امکان اعتبارسنجی درخواست‌ها را همراه با پیام‌های خطای دقیق و خوانا فراهم می‌کند. استفاده از Pydantic برای تعیین نوع داده‌های ورودی، یکی از عوامل اصلی فراهم شدن این قابلیت است.
مزایای استفاده از FastAPI چیست
مهم‌ترین مزایای استفاده از FastAPI

جمع‌بندی

در این مطلب از مجله فرادرس، به شکل ساده و کامل توضیح داده‌ایم که فریمورک مدرن و سریع FastAPI چیست و نحوه ساخت Web API در پایتون را مرور کردیم. برای راه‌اندازی سرور و ساخت نقاط پایانی به کمک این فریم‌ورک لازم است که پکیج‌های Uvicorn و FastAPI را نصب کنیم. برای مدیریت ورودی‌ها می‌توانیم از پارامترهای موجود در ریکوئست‌ها مانند پارامتر‌های مسیر، پرس‌وجو، بدنه درخواست، هدرها و کوکی‌ها استفاده کنیم. برای مدیریت خطاهای مربوط به API-ها در این فریم‌ورک هم می‌توانیم از کلاس HTTPException  استفاده کنیم.

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

مطالب مجله فرادرس را در جستجوی گوگل سریع‌تر ببینید

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر پرسشی درباره این مطلب دارید، آن را با ما مطرح کنید.
منابع:
RefineGeeksforGeeks
PDF
مطالب مرتبط
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *