7.2 KiB
استفاده از Dataclass ها
FastAPI براساس و روی امکانات Pydantic ساخته شده, و تا الان به شما نشون دادم که چطور request ها و response های خود را بر اساس مدل های Pydantic بسازید.
اما FastAPI از گزینه dataclasses
به شکل مشابه پشتیبانی می کنه:
{* ../../docs_src/dataclasses/tutorial001.py hl[1,7:12,19:20] *}
این امکان هنوز با تکیه بر Pydantic پشتیبانی میشه، با استفاده از امکان پیش فرض dataclasses
.
بنابراین حتی با وجود اینکه کد بالا به صورت مستقیم از Pydantic استفاده نمی کنه، FastAPI از Pydantic استفاده می کنه تا Dataclass های استاندارد رو به Dataclass های سبک Pydantic تبدیل کنه.
و البته از امکانات مشابه هم پشتیبانی می کنه:
- اعتبار سنجی داده
- serialize کردن داده
- مستند کردن داده، و غیره...
این مشابه مدل های Pydantic کار می کنه. و با استفاده از Pydantic در لایه های پایین به روش مشابه این کارو انجام میده.
/// info
نکته:
به خاطر بسپار که Dataclass تمام قابلیت ها Pydantic رو نداره.
بنابراین شما ممکنه هنوز نیاز به استفاده از کلاس های Pydantic داشته باشین.
اما اگه از قبل چندتایی Dataclass دارین, ترفند خوبیه که برای وب API ازش استفاده کنین با تکیه بر FastAPI. 🤓
///
استفاده از Dataclass ها در response_model
شما می توانید از ها dataclass
در پارامتر ورودی response_model
هم استفاده کنید:
{* ../../docs_src/dataclasses/tutorial002.py hl[1,7:13,19] *}
با استفاده از روش بالا dataclass به صورت اتوماتیک تبدیل که dataclass عه Pydantic میشه.
با این روش طرح و ساختار خروجی توی رابط کاربری مستندات API نشون داده میشه:

Dataclass ها در ساختار های داده تو در تو
همچنین برای ساختن ساختار های داده تو در تو شما می تونید dataclass
ها رو با روش های دیگر نشانه گذاری داده ترکیب کنید.
در برخی موارد ممکنه شما هنوز نیاز به استفاده از dataclass
های نسخه Pydantic داشته باشید. برای نمونه، اگر خطایی با مستندات API که به طور اتوماتیک تولید میشه وجود داشته باشه.
در این مورد شما می تونید به راحتی dataclasses
را با pydantic.dataclasses
, جایگزین کنید، که در کل یک جایگزینی مستقیم است:
{* ../../docs_src/dataclasses/tutorial003.py hl[1,5,8:11,14:17,23:25,28] *}
-
ما هنوز
field
را از ماژول استانداردdataclasses
ایمپورت می کنیم. -
pydantic.dataclasses
یک جایگزینی بی دردسر برایdataclasses
است. -
dataclass عه
Author
شامل لیستی از dataclass هایItem
است. -
dataclass عه
Author
به عنوان پارامتر ورودیresponse_model
استفاده شده. -
شما می تونید از روش های دیگر نشانه گذاری داده همراه dataclass ها برای محتوای request استفاده کنید.
در این مورد، لیست dataclass های
Item
است. -
اینجا ما دیکشنری پایتون که شامل
items
هست رو باز می گردانیم که لیستی از dataclass هاست.FastAPI هنوز قابلیت serializing داده به JSON را دارد.
-
اینجا
response_model
از نشانه گذاری list برای dataclass هایAuthor
استفاده می کنه.یاد آوری دوباره، شما می تونید
dataclasses
با نشانه گذاری استاندارد ترکیب کنید. -
دقت کن
get_authors()
<- path operation function از کلمه کلیدیdef
به جایasync def
استفاده می کنه.طبق معمول, تو FastAPI شما می تونید دو حالت
def
وasync def
در کنار هم براساس نیاز استفاده کنید.اگه نیاز به یادآوری داری که کدوم رو استفاده کنم, تو بخش "عجله دارم؟" در مستندات
async
وawait
{.internal-link target=_blank} رو چک کن. -
این path operation function به عنوان خروجی dataclass ها رو بر نمی گردونه (با اینکه می تونه), اما به جاش لیستی از دیکشنری های پایتون با مقادیر dataclass رو بر می گردونه.
FastAPI از پارامتر
response_model
برای تبدیل response استفاده خواهد کرد (شامل dataclass ها هم میشه).
شما می تونید dataclasses
با انواع دیگه نشانه گذاری تو شکل ها و ساختار های مختلف ترکیب کنید تا ساختارهای داده پیچیده بسازید.
برای جزئیات بیشتر می تونید راهنماهای نشانه گذاری که داخل کد های بالایی هست رو بررسی کنین.
یادگیری بیشتر
شما همچنین می تونید dataclasses
رو با مدل های دیگر Pydantic ترکیب کنید، از اون ها ارث بری کنید، اونارو اضافه کنین به مدل های خودتون، و غیره
برای یاگیری بیشتر مراجعه کنید به ها dataclass بخش Pydantic مستندات.
نسخه
این امکان از نسخه 0.67.0
FastAPI در دسترس و قابل استفاده است. 🔖
لغت نامه
بعضی اصطلاحات معنی مستقیم ندارن، بیشتر یه مفهوم هستن تا یه ترجمه کلمهبهکلمه. اینجا دقیق تر مفهوم رو تو محتوای برنامه نویسی و پایتون توضیح می دم.
type annotation: مفهومی است که برای اعتبار سنجی، تبدیل نوع داده و ازش تو تولید مستندات API و چند امکان دیگه استفاده میشه، این مفهوم نشانه گذاری
ترجمه شده.
path operation fucntion: یه فانکشن پایتون هست که وقتی به آدرس مثل /hello
تو مروگر درخواست داده میشه اون فانکشن اجرا میشه، برای مثال:
@app.get('/hello') -> path operation decorator
def hello(): -> path operation function
...