چرا FastAPI آینده توسعه وب پایتون است؟

منتشر شده در medium به تاریخ ۲۷ فوریه ۲۰۲۲
لینک منبع Why FastAPI is a Future of Python Web Development

مقدمه

اگر شما یک توسعه‌دهنده پایتون Back-endهستید یا حداقل به نحوی به این فیلد متصل هستید، حتماً درباره FastAPI شنیده‌اید. این یک ترند واضح در صنعت است. در این مقاله سعی می‌کنیم دلایل اصلی آن را شناسایی کنیم و شاید به فریم‌ورک انتخابی شما تبدیل شود.

حال FastAPI چیست؟

در اصل FastAPI یک چارچوب وب مدرن و سریع (همانند نام آن) برای ساخت APIبا پایتون است. این بر روی چارچوب Starlette ساخته شده است و به‌شدت بر حاشیه‌نویسی‌های تایپ پایتون برای ارائه اعتبارسنجی، سریال‌سازی و مستندسازی سریع و کارآمد درخواست‌ها و پاسخ‌های API متکی است.

ویژگی‌های اصلی FastAPIچیست؟

  • عملکرد سریع: FastAPI با کتابخانه‌های با کارایی بالا مانند Pydanticو Uvicorn برای دستیابی به سرعت‌های باورنکردنی و مدیریت بارهای ترافیکی بالا ساخته شده است.
  • ساده و آسان برای استفاده: FastAPI با یک API ساده و شهودی ارائه می‌شود که یادگیری و استفاده از آن آسان است.
  • اعتبارسنجی و سریال‌سازی آسان: FastAPI از type hints پایتون برای اعتبارسنجی خودکار درخواست‌ها و پاسخ‌های API و همچنین برای سریال‌سازی و سریال‌زدایی خودکار داده‌ها به و از JSON استفاده می‌کند و تکرار واضحات کد را حذف می‌کند.
  • اسناد داخلی: FastAPI به‌طور خودکار اسناد API تعاملی را تولید می‌کند و به توسعه‌دهندگان این امکان را می‌دهد تا به‌سرعت و به‌راحتی API‌ها را کاوش و آزمایش کنند.
  • پشتیبانی از ASGI : فریم‌ورک FastAPI بر روی ASGI (رابط دروازه سرور ناهمزمان) ساخته شده است و به آن اجازه می‌دهد تا از قدرت برنامه‌نویسی ناهمزمان برای عملکرد سریع‌تر استفاده کند.
  • تزریق وابستگی: FastAPI از سیستم تزریق وابستگی پایتون برای تزریق خودکار وابستگی‌ها به نقاط انتهایی API و سایر مؤلفه‌ها استفاده می‌کند و ساخت برنامه‌های پیچیده را آسان می‌کند.

بیایید در مورد برخی از آنها با جزئیات بیشتری آشنا شویم.

اعتبارسنجی و سریال‌سازی آسان

به نظر من، این برتر‌ترین بخش FastAPIاست. نکته کلیدی در اینجا این است که FastAPI از سینتکس داخلی پایتون برای دستیابی به این موارد استفاده می‌کند. در اینجا یک مثال آورده شده است:

from fastapi import FastAPI
 
 app = FastAPI()
 
 
 @app.get(&quot/items/{item_id}&quot)
 async def read_item(item_id: int):
  return {&quotitem_id&quot: item_id}

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

“/items/test”

یک خطای اعتبار‌سنجی برمی‌گرداند:

{
  &quotdetail&quot: [
  {
  &quotloc&quot: [
  &quotpath&quot,
  &quotitem_id&quot
  ],
  &quotmsg&quot: &quotvalue is not a valid integer&quot,
  &quottype&quot: &quottype_error.integer&quot
  }
  ]
 }

اما اگر به چیزی پیچیده‌تر از آن نیاز داشته باشید چه؟

پیدانتیک (Pydantic)

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

در اینجا یک مثال استفاده از Pydantic در برنامه FastAPI آمده است:

from typing import Union
 
 from fastapi import FastAPI
 from pydantic import BaseModel
 
 
 class Item(BaseModel):
  name: str
  description: Union[str, None] = None
  price: float
  tax: Union[float, None] = None
 
 
 app = FastAPI()
 
 
 @app.post(&quot/items/&quot)
 async def create_item(item: Item):
  return item

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

بیایید مثال استفاده از سریال‌سازهای Django REST Framework را برای رسیدن به نتیجه مشابه ببینیم:

class CommentSerializer(serializers.Serializer):
  name = serializers.CharField(max_length=200)
  description = serializers.CharField(max_length=500, required=False)
  price = serializers.FloatField()
  tax = serializer.FloatField(required=False)

این یک نمونه ساده از سریال‌ساز DRFاست و البته کار می‌کند، اما نسخه Pydantic یک راه تمیزتر و پایتونیک‌تر است.

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

اسناد خودکار

فریم‌ورک FastAPI طرح‌واره OpenAPI را بر‌اساس type hints، مدل‌های Pydantic و پارامترهای تابع عملیات مسیر تولید می‌کند و در اسناد API تعاملی نشان داده می‌شود. FastAPI فرصت‌های گسترده‌ای برای اصلاح و پیکربندی اسناد بر‌اساس نیازهای شما می‌دهد. می‌توانید توضیحات، نظرات، عنوان‌ها، مثال‌ها و هر چیزی را که فکر می‌کنید به نحو تمیز اضافه کنید.

پشتیبانی از ویرایشگر

این ویژگی بازتابی از نکات ذکر‌شده در بالا است.

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

تزریق وابستگی

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

تزریق وابستگی یک الگوی طراحی پرکاربرد در سایر زبان‌های برنامه‌نویسی است، اما در پایتون نه. این از زبان‌های OOPکامل مانند جاوا و دات‌نت می‌آید، بنابراین ممکن است حتی با آن آشنا نباشید، اما نظر شما چیست؟ آن همچنان یک نجات‌دهنده است.

بیایید ببینیم که چگونه در FastAPI کار می‌کند.

برای پیاده‌سازی DI، باید یک «وابسته» داشته باشیم، که در FastAPI هر تابعی (همگام‌سازی، یا غیرهمگام‌سازی) است که می‌تواند تمام پارامترهای مشابهی را که یک تابع عملیات مسیر می‌تواند بگیرد، داشته باشد.

from typing import Union
 
 from fastapi import Depends, FastAPI
 
 app = FastAPI()
 
 
 async def common_parameters(
  q: Union[str, None] = None, skip: int = 0, limit: int = 100
 ):
  return {&quotq&quot: q, &quotskip&quot: skip, &quotlimit&quot: limit}
 
 
 @app.get(&quot/items/&quot)
 async def read_items(commons: dict = Depends(common_parameters)):
  return commons
 
 
 @app.get(&quot/users/&quot)
 async def read_users(commons: dict = Depends(common_parameters)):
  return commons

در اینجا common_parameters مستقل و قابل‌اعتماد است و read_items، read_users وابسته هستند.

قبل از اجرای کد read_items، common_parameters اجرا خواهند شد.

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

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

from typing import Union
 
 from fastapi import Depends, FastAPI, Cookie
 
 app = FastAPI()
 
 
 async def common_parameters(
  q: Union[str, None] = None, skip: int = 0, limit: int = 100
 ):
  return {&quotq&quot: q, &quotskip&quot: skip, &quotlimit&quot: limit}
 
 
 def check_cookies(ads_id: Union[str, None] = Cookie(default=None)):
  return {&quotads_id&quot: ads_id}
 
 
 @app.get(&quot/items/&quot)
 async def read_items(
  commons: dict = Depends(common_parameters), cookie: dict = Depends(check_cookies)
 ):
  return commons

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

کد تمیز

همه نکات بالا به‌خودی‌خود عالی هستند، اما مهم‌ترین بخش این است که آنها به سمت پاک کردن عادات کد هدایت می‌شوند (اگر اجباری نباشد!). من توسعه‌دهندگان پایتون را دیده‌ام که حتی نمی‌دانند type annotationsچیست و چرا به آن‌ها نیاز داریم، برنامه‌های زیادی را دیده‌ام که کدهای تکراری زیادی دارند. FastAPI نوشتن نکات تایپ، اعلام وابستگی‌ها و پیروی از الگوهای طراحی OOPرا اجباری می‌کند که به ایجاد ساختار کد عالی و تمیز نگه داشتن کد کمک می‌کند. به همین دلیل است که اکنون بسیار محبوب است و من احساس می‌کنم که ماندگار است.

نتیجه‌گیری

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

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