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

در این مطلب از مجله فرادرس، فریمورک FastAPI را بررسی میکنیم. ابتدا توضیح دادهایم که FastAPI چیست و چه کاربردهایی دارد. سپس نکات مهم مربوط به مراحل ساخت API با این فریم ورک را با کمک مثالهای سادهای بررسی خواهیم کرد. در پایان هم این فریم ورک را با رقبای مطرحی مانند جنگو، فلسک و پیرامید مقایسه میکنیم.
FastAPI چیست؟
فریمورک مدرن FastAPI با این هدف طراحی شده است که برنامه نویسی «بک اند» (Back End)، وباپلیکیشنها و ساخت API با پایتون را سادهتر کند. کدهای نوشته شده با فریمورک FastAPI علاوه بر سرعت و سادگی، کیفیت و عملکرد بالایی هم دارند.
در فهرست پایین، چند مورد از مهمترین ویژگیهای FastAPI را توضیح دادهایم.
- قدرتمند و دقیق: FastAPI بر پایه کتابخانههای «Starlette» و «Pydantic» ساخته شده است.
- کیفیت بالا: کیفیت بسیار بالایی دارد و میتواند دادهها را به شکل قابل اعتمادی مدیریت کند.
- کاربرد گسترده: در حوزه توسعه REST API، میکروسرویسها و سیستمهای بکاند برای وب و اپلیکیشنهای موبایل کاربرد دارد.
- سادگی: سینتکس ساده و کاربر پسندی دارد.

فریمورکهای مختلفی مانند «جنگو» (Django) و «فلسک» (Flask) با هدف ساخت «واسطهای برنامهنویسی کاربردی وب» (Web API) توسعه یافتهاند. بااینحال، سرعت همچنان یکی از چالشهای مهم در توسعه وب با پایتون بود. به همین دلیل، فریمورک دیگری به نام FastAPI برای پایتون ایجاد شد که هدف آن بهبود عملکرد و رفع بخشی از این محدودیتهاست.
FastAPI سادگی فلسک را نیز حفظ کرده است و ساختار آن شباهت زیادی به این فریمورک دارد. بااینحال، امکانات مفیدی مانند اعتبارسنجی دادهها، مستندسازی خودکار و رمزگذاری پاسخها را نیز به صورت پیشفرض در اختیار توسعهدهندگان قرار میدهد.
تا این قسمت از مطلب، به طور کلی متوجه شدیم که فریمورک FastAPI چیست و چه کاربردی دارد. در بخشهای بعد روش کار با این فریمورک کاربردی و مدرن را در کنار چند ترفند و نکته مهم همراه با مثالهای سادهای میآموزید. در صورت تمایل به مطالعه مطالبی مانند این مورد، پیشنهاد میکنیم که حتما اپلیکیشن مجله فرادرس را بر روی دستگاههای همراه خود نصب کنید.
برای نصب اپلیکیشن رایگان مجله فرادرس، کلیک کنید.
روش شروع به کار با FastAPI چیست؟
راهاندازی پروژه با FastAPI ساده است و در چند مرحله کوتاه انجام میشود.
- ابتدا، مانند هر پروژه پایتونی دیگری، بهتر است که محیط مجازی ایجاد کنیم.
- سپس بستههای «FastAPI» و «Uvicorn» را نصب میکنیم.
برای شروع به کار و نصب بستههای معرفی شده در بالا دستور زیر را در خط فرمان یا پاورشل ویندوز یا ترمینال لینوکس نوشته و دکمه Enter را فشار میدهیم.
python -m pip install fastapi 'uvicorn[standard]'وجود پکیجهای fastapi و uvicorn برای راهاندازی پروژههای FastAPI ضروری است.
- uvicorn: این پکیج همان سروری را میسازد که پروژه FastAPI بر روی آن میشود.
- fastapi: این پکیج هم متدها و پیکربندیهای مورد نیاز برای ساخت نقاط پایانی API-ها را ایجاد میکند.

ساخت اولین روت
برای ساخت اولین روت fastapi با همان روش پایتونی همیشگی شروع میکنیم. یعنی اول از همه فایلی با نام «main.py» میسازیم که تمام کدهای پروژه را در آن بنویسیم. فایل را در ویرایشگر کد خود باز کرده و دستورات زیر را داخل آن مینویسیم.
نکته: برای نوشتن مثالهای این مطلب از ویرایشگر کد ویژوال استودیو کد استفاده میکنیم. اما شما میتوانید با هر ویرایشگر دیگری مانند پیرامید، «پایچارم» (PyCharm) و غیره کار کنید. نوع ویرایشگر در کدها، پکیجها و سینتکس برنامه هیچ تاثیری ندارد.
- در خط اول تکه کد بالا، ابتدا کلاس FastAPI را از ماژول fastapi به محیط کدنویسی وارد میکنیم.
- سپس شیئی به نام fastapi از روی این کلاس میسازیم.
- از این به بعد میتوانیم از شی ساخته شده از روی کلاس FastAPI به صورت دکوراتور استفاده کنیم.
این دکوراتور برای توابعی به کار میرود که با هدف ساخت نقاط پایانی طراحی شدهاند. با استفاده از این روش، میتوان دستورات اصلی REST API مانند PUT و DELETE و PATCH و GET و POST را به کار برد و مسیر منبع را نیز تنظیم کرد.
بعد از نوشتن دستورات بالا با اجرای کد زیر در خط فرمان ویندوز یا ترمینال لینوکس میتوانید سرور خود را راهاندازی کنید.
uvicorn main:fastapi --reloadاین دستور سرور را اجرا میکند. سپس از طریق مرورگر و با مراجعه به آدرس 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بعد از نوشتن تابع باید دکوراتور خود را با کمک نمونه ساخته شده از روی کلاس FastAPI به تابع اضافه کنیم. دکوراتور را به شکل زیر مینویسیم.
با اضافه شدن این دکوریتور به تابع، بلوک کد از تابع به نقطه پایانی API تبدیل میشود.
برای ساخت نقاط پایانی مختلف میتوانیم از دکوریتورهای زیر استفاده کنیم.
- @fastapi.post
- @fastapi.put
- @fastapi.patch
- @fastapi.delete

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

پایتون، گزینهای بسیار مناسب برای توسعه نرمافزارهای مدرن و پیچیده به خصوص در حوزه هوش مصنوعی است. فرادرس هم با توجه به این مسئله، مجموعهای غنی از فیلمهای آموزشی پایتون را تولید کرده است. این فیلمها از ابتداییترین موارد تا نکات بسیار پیچیده و حرفهای را پوشش میدهند. برای همین با استفاده از فیلمهای فرادرس میتوانید به مهارت بسیار خوبی در حوزه برنامه نویسی با پایتون برسید.
در پایین، چند مورد از فیلمهای آموزش پایتون را نام بردهایم. این فیلمها برای آموزش سطوح مبتدی تا پیشرفته پایتون مفید هستند.
- فیلم آموزش میکروفریم ورک فلسک در پایتون، طراحی وب اپلیکیشن با Flask + گواهینامه
- فیلم آموزش ساخت نرم افزارهای گرافیکی دسکتاپ با PySide6 در پایتون، همراه با بررسی پروژههای کاربردی
- فیلم آموزش برنامه نویسی پایتون، همراه با مثالها و پروژه عملی + گواهینامه
- فیلم آموزش برنامه نویسی پایتون، دروه مقدماتی + گواهینامه
- فیلم آموزش رایگان پایتون، برنامه نویسی سریع و آسان در ۱۴۰ دقیقه + گواهینامه
در بخش بعد، روش مدیریت بدنه درخواستها و پاسخها را با استفاده از 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 قرار میگیرند. این پارامترها بعد از علامت سوال (?) در آدرس وب قرار میگیرند.

برای استفاده از آنها در 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-های خود دسترسی دارید. در قسمت بعد روش استفاده از 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) بر روی بعضی از نقاط پایانی اجرا خواهد شد.
پیشنیازهای اجرای پروژه
برای اجرای این پروژه باید حداقل دانش قابل قبول را درباره کار با موارد زیر داشته باشید.
در ضمن به پایتون نسخه ۳.۱۰ هم به صورت نصب شده در کامپیوتر نیاز داریم.
تنظیمات اولیه پروژه
مراحل مربوط به تنظیمات اولیه پروژه را در فهرست پایین نوشتهایم.
- قبل از هر کاری محیط مجازی پایتون را بر روی دایرکتوری هدف بسازید و فعال کنید.
- بعد از فعال کردن محیط مجازی دایرکتوری «src» را در کنار فولدر مربوط به این محیط بسازید. تمام کدهای خود را داخل این دایرکتوری مینویسیم.
- سپس دایرکتوری را با استفاده از ویرایشگر کد خود باز کنید. ظاهر داریکتوریها در ویرایشگر کد مانند تصویر زیر خواهد بود.

نکته: البته اصلا نیازی به قرار دادن دایرکتوری پروژه داخل دایکتوری مربوط به فضای مجازی نیست. همینکه فضای مجازی فعال شود میتوانیم از پروژه خود در محیطی ایزوله استفاده کنیم. یعنی توصیه شده که کدهای پروژه حتما بیرون از دایرکتوری مربوط به محیط مجازی قرار بگیرند.
نصب وابستگیها
برای اجرای این پروژه به نصب وابستگیهای ضروری مانند uvicorn و fastapi احتیاج داریم. هر چند با اضافه کردن اتصال به پایگاه داده و سیستم بارگذاری عکس در این پروژه میخواهیم تواناییهای سرور را ارتقا بدهیم. بنابراین به وابستگیهای دیگری هم نیاز خواهیم داشت. برای مثال، پایگاه داده مناسب و SQLAlchemy را هم باید نصب کنیم.
با هدف نصب وابستگیهای مورد نیاز این پروژه، دستور زیر را در خط فرمان نوشته و دکمه Enter را فشار دهید.
pip install 'fastapi[all]' 'uvicorn[standard]' databases sqlalchemyنکته: این دستور مربوط به محیط لینوکس و MacOS است. در صورت کار با ویندوز باید کاراکترهای کوتیشن را از دستور حذف کنید.
ساخت نقاط پایانی مورد نظر
ابتدا وارد دایرکتوری src بشوید. سپس فایل جدیدی به نام main.py در این دایرکتوری ایجاد کنید. این کار را به عنوان نقطه شروعی برای پیادهسازی پروژه در نظر بگیرید. البته به غیر از کار با این فریمورک، روشهای مختلفی برای ساخت API با پایتون وجود دارد. در صورت تمایل به آشنایی با این روشها پیشنهاد میکنیم که مطلب مربوط به این مسئله را در مجله فرادرس مطالعه کنید.
اکنون کدهای زیر را در فایل main.py بنویسید (یا از همینجا کپی و پیست کنید.).
در تکه کدهای بالا ۵ هندلر برای نقاط پایانی تعریف کردهایم.
- ابتدا انبار محلی با نام inventory برای ذخیره تمام آیتمهای اضافه شده میسازیم.
- از کلاس ItemUpdate برای مشخص کردن اطلاعاتی استفاده میکنیم که در بدنه درخواست PATCH به endpoint ارسال میشوند. میتوان از این کلاس برای تعریف پارامترهای اختیاری هم استفاده کرد.
- کلاس Optional را از ماژول typing و کلاس Field را از pydantic وارد کردهایم. با کمک این کلاسها میتوانیم فیلدهای اختیاری بسازیم.

در ادامه توابع کاربردی را در فایلی به نام «utils.py» قرار خواهیم داد. این فایل را در دایرکتوری src میسازیم.
اکنون میتوانیم سرور را اجرا کرده و تمام نقاط پایانی تعریف شده را با توجه به مستندات API آزمایش کنیم.
روش مدیریت خطا در FastAPI چیست؟
«مدیریت خطا» (Error Handling) در fastapi بسیار ساده و قابل درک است. fastapi برای انجام بهتر این کار، کلاس درونی را با نام HTTPException فراهم کرده است. با کمک این کلاس، هر وقت که بخشی از سیستم به مشکل خورد میتوانیم پاسخهای مناسبی را به سادگی برگردانیم.
مراحل ساخت API با FastAPI بسیار ساده است. اما نکات ریزی مانند همین مدیریت خطا و غیره وجود دارند که با رعایت آنها میتوانیم محصولی پیشرفته و حرفهای به کاربران ارائه دهیم. برای یادگیری روش کار با این فریمورک پیشنهاد میکنیم که فیلم آموزش ساخت وب سرویس API با FastAPI در پایتون، دوره مقدماتی + گواهینامه را در فرادرس مشاهده کنید. به منظور کمک به مخاطبان مجله، لینک دسترسی مستقیم به این فیلم را در پایین نیز قرار دادهایم.
در کادر پایین، مثال سادهای را درباره استفاده از کلاس HTTPException برای مدیریت دادههای ورودی نامعتبر پیادهسازی کردهایم.
اکنون هر وقت که کاربری مقدار item_id را در درخواست ارسال شده کمتر یا مساوی صفر قرار دهد، با پاسخ زیر روبهرو خواهد شد.
روش سفارشی سازی پاسخهای خطا در FastAPI چیست؟
برنامه نویسان میتوانند پاسخهای خطا را در fastapi با سلیقه خودشان به شکل سفارشی تغییر بدهند. بیشتر اوقات این کار برای افزودن اطلاعات بیشتر به پاسخ انجام میشود.
اکنون اگر شماره ID کاربر نامعتبر باشد، پاسخ زیر برگردانده میشود.
دریافت خطاهای سرور
خطاهای غیر منتظره را میتوان با کمک هندلرهای استثنایی زیر مدیریت کرد.
کدهای بالا تضمین میکنند که اگر مشکل ناخواستهای در سرور رویداد، حتما پیام مناسبی به سمت کاربران ارسال شود.
بهینهسازی عملکرد در FastAPI
به طور پیشفرض، سرعت کار فریمورک FastAPI بالا است. اما راههایی وجود دارد که برنامه نویسان با کمک آنها میتوانند باز هم سرعت کار این فریمورک را بالاتر ببرند.
چند مورد از مهمترین روشهای مربوط به اجرای سریعتر پروژههای FastAPI را در فهرست پایین نام بردهایم.
- استفاده از کتابخانههای آسنکرون یا ناهمگام
- پیادهسازی کش
- استفاده از سرورهای توزیع متوازن باز
- ارتقای بهرهوری کوئریها
- فشردهسازی Gzip

در ادامه این بخش از مطلب، تمام کدهای مربوط به ترفندهای ساده بالا را یک به یک بررسی خواهیم کرد.
استفاده از کتابخانههای آسنکرون یا ناهمگام
برای پاسخ به درخواستهای HTTP از کتابخانههای «ناهمگام» یا «async» مانند httpx استفاده کنید. در این صورت انتظار برای پاسخ HTTP بقیه کارها را مسدود نمیکند.
پیادهسازی کش
اغلب اوقات سرورها به طور تکراری با پایگاه داده و API-های یکسان کار میکنند. کش کردن دادهها میتواند تعداد فراخوانیهای پایگاه داده یا API را کاهش دهد. Redis یکی از بهترین ابزارها برای کش کردن پاسخهای دریافت شده است.
استفاده از سرورهای توزیع متوازن باز
سرویسهای «توزیع متوازن بار» یا همان «لود بالانسر» (Load Balancer) مانند «Nginx» یا «Traefik» را برای مدیریت بیشتر کارهای مربوط به درخواستها پیکربندی کنید. برای مثال در کادر پایین، نمونهای از فایل پیکربندی Nginx را نوشتهایم.
ارتقای بهرهوری کوئریها
منظور از عبارت «ارتقای بهرهوری کوئریها» این است که با استفاده از کارهایی مانند اندیسگذاری دادهها و جلوگیری از واکشی غیرضروری اطلاعات یا دادههای بدون کاربرد، عملکرد و کارایی کوئریهای ارسال شده با پایگاه داده را بیشتر کنیم.
فشردهسازی Gzip
با استفاده از فشردهسازی Gzip میتوانیم اندازه پاسخهای برگشتی را کوچکتر بکنیم. برای استفاده از این تکنیک، ابتدا باید ماژول مربوط به فشردهسازی در FastAPI را نصب کنیم.
pip install fastapi-compressionبا استفاده از کدهای بالا اندازه پاسخهای ارسالی با رعایت استانداردهای دقیق کاهش پیدا میکند.
رعایت ترفندها و نکات گفته شده در این بخش به سریعتر و کارآمدتر شدن اپلیکیشن FastAPI کمک میکند. در ضمن این اپلیکیشن الان میتوانید وظایف سنگینی را به راحتی مدیریت کند.
مفاهیم پیشرفته در FastAPI
بیشتر اوقات API-ها به همان سادگی نیستند که در بخش پروژه عملی برای ذخیره کردن عکس ساختیم. گاهی لازم است پیش از مدیریت درخواستها یا فایلهای ارسالی، هویت کاربر یا سیستم ارسالکننده درخواست تایید شود. در برخی موارد نیز باید دادهها را در پایگاه داده ذخیره کنیم.
برای مثال، در ادامه میخواهیم «میانافزاری» (Middleware) برای اعتبارسنجی اپلیکیشن ذخیرهسازی inventory (که در بخشهای قبل تعریف کردیم) اضافه کنیم. همچنین قابلیت بارگذاری فایلها و اتصال به پایگاه داده را نیز به این اپلیکیشن اضافه خواهیم کرد.
پیادهسازی میان افزار تایید هویت
در دنیای استفاده از API-ها، میانافزار مانند دریچه یا سوپاپ عمل میکند. این ابزارها کاربردهای بسیار زیاد و متنوعی دارند. برای مثال میتوان به محدودکردن دسترسی برای بعضی کاربران، افزودن اطلاعات اضافی به درخواستها و غیره اشاره کرد. برای نمایش روش کار این ابزارها، در این بخش میخواهیم میانافزاری درست کنیم که فقط به کاربرانی با مجوز خاص امکان دسترسی به دادهها را میدهد. سپس این Middleware را به چند مورد از نقاط پایانی اپلیکیشن ذخیرهسازی (تعریف شده در بخش بالا) اضافه میکنیم.

قبل از هر کاری باید فایل جدیدی با نام 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 ایمپورت بکنیم.

در ضمن باید توجه کنید که لازم است هندلرهای روت را هم به همینترتیب بهروزرسانی کنیم.
در کدهای بالا ابتدا نمونهای از SessionLocal را برای هر نقطه پایانی ایجاد کرده و سپس از این نمونه برای اجرای کوئریهای پایگاه داده استفاده میکنیم. پس از اجرای کوئری، میتوانیم تغییرات ایجاد شده را برای ذخیره در پایگاه داده، ثبت کنیم.
روش بارگذاری فایلها در FastAPI چیست؟
با استفاده از fastapi به راحتی میتوانیم فایل بر روی اپلیکیشن بارگذاری کنیم. اکنون از API موجود برای نمایش روش بارگذاری و ارائه فایلها استفاده خواهیم کرد. قبل از هرکاری باید با اضافه کردن کدهای زیر، DBItem را در فایل database.py بهروزرسانی کنیم.
اکنون باید چند ایمپورت مهم در فایل main.py انجام بدهیم.
- File و UploadFile از فایل fastapi
- کتابخانه OS
- FileResponse از کتابخانه starlette.responses
بعد از نوشتن ایمپورتهای بالا، کدهای زیر را به فایل اضافه کنید:
- اولین روت هندلری که در کدهای بالا نوشتهایم وظیفه بهروزرسانی فیلد image_src از آیتم مشخص شده و بارگذاری فایل بر روی سرور را برعهده دارد.
- دومین روت هندلر، با نام serve_file ، وظیفه دریافت فایل از سرور را برعهده دارد.
یادگیری عملی پایتون با کمک فرادرس
به دلیل شباهت زیاد سینتکس پایتون به زبان انسان، یادگیری آن نسبت به دیگر زبانها آسانتر است. بهترین روش برای درک درست مفاهیم پایتون، کار با آنها برای اجرای پروژههای واقعی است. بیشتر اوقات در پروژههای واقعی از تکنیکهای متنوع به صورت ترکیبی و در کنار هم استفاده میکنیم. از طرف دیگر اجرای پروژههای سادهای مانند بررسی چند نمونه سوال حلقه for در پایتون به یادگیری این دستور کمک میکند. فرادرس، مجموعهای از فیلمهای آموزشی را با عنوان «مجموعه آموزش پروژه محور برنامه نویسی پایتون» تولید و منتشر کرده است. در این مجموعه، روش پیادهسازی پروژههای واقعی و گوناگون آموزش داده شده است.
در پایین، چند فیلم آموزشی پروژه محور برای زبان پایتون را معرفی کردهایم.
- فیلم آموزش بهینه سازی سبد سهام در پایتون با روش های هوشمند، کار بر روی پورتفولیو مالی + گواهینامه
- فیلم آموزش پروژه محور پایتون، درباره مدیریت فایل ها
- فیلم آموزش امنیت اطلاعات و رمزنگاری + گواهینامه
- فیلم آموزش ساخت چت روم با سوکت نویسی در پایتون، Socket Programming در Python
- فیلم آموزش پروژه محور جنگو و پایتون× طراحی سایت و وب اپلیکیشن با فریمورک Django + گواهینامه
برای مشاهده فیلمهای بیشتر بر روی تصویر زیر، کلیک کرده و به صفحه اصلی این مجموعه آموزش هدایت شوید.

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

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














