DRF چیست؟ مزایا و معایب Django Rest Framework

DRF چیست؟ مزایا و معایب Django Rest Framework

آموزشی
7 آذر 1403

اگر شما با جنگو کار کردید و میدونید که جنگو چیست و فکر میکنید که جنگو چقدر فوق العاده است باید ببینید که Django Rest Framework (DRF) چه کارهایی میتونه بکنه. برای استفاده از DRF باید پایتون (python) و جنگو (Django) رو نصب کرده باشید که میتونید آموزش نصب پایتون و آموزش نصب جنگو رو در صورت نیاز ببینید.

 

Django Rest Framework یا DRF چیست؟

DRF که کوتاه شده ی Django Rest Framework است یک ابزار متن باز (open source) و خیلی قدرتمند و منعطف برای ساخت RESTFul API های استانداردتر بصورت ساده و سریع در کم ترین زمان ممکن برای فریم ورک جنگو (Django) است.

اگر توی پروژه جنگویی خودتون نیاز به ساخت Web api داشتید DRF میتونه یه کمک خیلی بزرگ برای شما باشه، الان میبینم که استفاده از DRF برای ساخت RESTful API توی جنگو تبدیل به یک استاندارد شده (هر چند که بدون استفاده از DRF هم میتونید توی جنگو درخواست JSON ارسال کنید).

برای درک بیشتر مفهوم RESTful API به زبان ساده، مقاله RESTful API چیست رو مطاله کنید.

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

اگر با مفهوم مهم API آشنا نیستید مقاله API چیست رو مطاله کنید.

 

چه زمانی از Django Rest Framework یا DRF استفاده میشود؟

در وبسایت هایی که سمت Client انها بصورت SPA یا تک صفحه به کمک فریم ورک هایی مثل React یا Vue و Angular ساخته شدن در چنین شرایطی برای ارتباط گرفتن با سمت سرور یا Back-End از API استفاده میکنن. مزیت این روش اینه وقتی بخواید Client application جدیدی مثل برنامه موبایل یا دسکتاپ به همون وبسایت اضافه کنید نیازی به ساخت بک اند با دیتابیس جدید نیست میتونید از API ها توی برنامه های مختلف استفاده کنید.

در چنین شرایطی شما با استفاده از جنگو رست فریم ورک یا DRF میتونید RESTFul API های استاندارد در سریع ترین زمان ممکن بسازید چون واقعا خیلی از کارها رو خودش اتوماتیک انجام میده و مدیریت میکنه تا توسعه دهنده مجبور به انجام کارهای تکراری نشه.

نحوه کار DRF توی چنین پروژه هایی:

drf restful api

 

مزایا و معایب Django Rest Framework (DRF)

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

 

مزایای DRF:

 

سهولت استفاده

اگه شما از قبل جنگو رو درک کردید (مخصوصا بخش View ها در معماری MVT جنگو، چون بخش Model تغییری نمیکه و بخش Template هم در حالت عادی بصورت مستقیم در DRF درگیر نیست) دیگه برای شروع DRF مسیر سختی ندارید با وجود اینکه View ها ممکنه کمی فرق داشته باشن ولی اگه منطق و logic تعریف کردن View ها توی جنگو رو درک کرده باشید با یکسری تفاوت میتونید با DRF کار کنید.

اکثر مشکلات رایجی که توسعه دهنده ها با ساخت API داشتند رو DRF حل کرده. وقتی این مشکلات رو DRF مدیریت میکنه به توسعه دهنده اجازه میده که روی ساخت endpoints یا نقاط پایانی برنامه تمرکز کنه ( endpoint در واقعی یک آدرس یا مسیری است که معمولا شامل یک URL خاصه که درخواست ها یا request ها رو دریافت و پاسخ میده و برای ارتباط با سرویس ها استفاده میشه).

 

امینت

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

django rest framework به همراه کلی ویژگی های امنیتی ارائه میشه مثل CSRF Protection، data validation و request throttling و... .

 

به پختگی رسیده

django rest framework (drf) مدت زیادیه که داره توسعه داده میشه و امتحان خودش رو در شرایط مختلف پس داده واسه همینه که میبینیم توی خیلی از کمپانی های بزرگ مثل Mozilla, Red Hat, Heroku و.. داره از DRF استفاده میشه.

یکی از ویژگی های خوب در DRF که به نظرم خیلی خوب در موردش فکر شده اینه که مبتنی بر معماری ماژولار توسعه داده شده که همین موضوع به توسعه دهنده اجازه میده اجزای مختلف رو بدون دردسر زیادی تعویض کنه یا تغییر بده. برای مثال اجزایی مثل لایه ی serialization و سیستم permission و authentication و.. .

 

اکوسیستم عظیم

جامعه عظیمی از توسعه دهنده ها در دنیا از DRF استفاده میکنن که این موضوع انتخابش رو برای استفاده در پروژه ها خیلی راحت میکنه چون یکی از مهم ترین مسائلی که توی انتخاب تکنولوژی های یک پروژه بخصوص در نظر میگیرن اینه که آیا اون تکنولوژی مستندات و جامعه قوی برای پشتیبانی داره؟ که وقتی پروژه به مشکل خورد، بشه سریع راه حل مشکل رو پیدا کرد که این موضوع یکی از برگ برنده های DRF است.

 

معایب DRF:

 

 توی دنیای برنامه نویسی شما هیچ تکنولوژی پیدا نمی کنید که بدون عیب باشه چیزی که مهمه اینه که اون تکنولوژی برای چه جاهایی مناسبه و ویژگی هاش رو بدونیم، DRF هم از این قضیه مستثنی نیست در ادامه برخی معایب DRF رو بررسی مکنیم: 

 

زمان بر بودن تسلط کامل

شروع و کار کردن اولیه با DRF به نسبت راحته همون طور که بالاتر اشاره شد ولی برای اینکه بخواید از همه امکانات و ویژگی های DRF بدرستی استفاده کنید و به تسلط برسیم ممکنه یکم زمان بر باشه (مخصوصا اگه توی درک اولیه جنگو مشکل داشته باشید) ولی وقتی به تسلط و درک قابل قبول از DRF برسید متوجه کارکرد روان DRF میشید، میتونید توی زمان خیلی کم با حجم کد خیلی کمتر ( میتونه حتی نصف حجم codebase قدیمتون باشه) یک برنامه سطح بالا بسازید.

 

مشکلات عملکردی

هدف اصلی که DRF واسش توسعه داده ساخت API در سریع ترین زمان ممکن بصورت ساده و راحت بوده ولی عملکرد  (performance) خیلی بالا جزء دغدغه های اصلی توسعه اش نبوده.

روند serialization در DRF به نسبت کتابخانه هایی مثل serpy و marshmallow کند تر است (مقایسه بیستر در بنچمارک). یک نکته ای که ممکنه شما رو به اشتباه بندازه اینه که همون طور در بنچمارک هم دیدید تفاوت ها به اندازه چند دهم ثانیه و صدم ثانیه هستن که توی خیلی از پروژه ها اصلا تفاوتش احساس نمیشه و در نظر گرفته نمیشه ولی در یکسری پروژه ها حتی صدم ثانیه هم میتونه مهم باشه پس همه چی به نیاز پروژه بستگی داره.

یک مشکل عملکردی که به احتمال زیاد توی توسعه API با DRF بهش بر میخورین وقتیه که DRF می خواد related field ها (مربوط به بخش model جنگو) رو سریال سازی (serializing) بکنه.

DRF بصورت اتوماتیک query set هایی که به serializer ها میده رو بهینه (optimize) نمیکنه، برای حل این مشکل که به مشکل N + 1 معروفه شما باید با استفاده select_related و prefetch_related اون query set ها رو قبل از اینکه به serializer ها بدید بهینه کنید اینطوری میتونید این مشکل رو حل کنید.

همون طور که بالاتر هم گفتیم تسلط توسعه دهنده روی DRF خیلی تاثیر گذاره روی نتیجه نهایی برنامه، شما با دونستن ساختار و محدودیت های DRF میتونید با راه حل هایی مثل همین راه حلی که برای همین مشکل n + 1 گفتیم برنامه خودتون رو بهبود بدید.

 

نبود قابلیت های جدید

تمرکز تیم توسعه DRF بیشتر روی بازنگری و رفع باگ و بهبود قابلیت های فعلی اش است و کمتر روی ارائه کردن قابلیت های جدید کار میکنن. این موضوع شاید برای بعضی برنامه ها یکم دست توسعه دهنده رو توی توسعه ببنده؛ نبود قابلیت هایی (یا ضعف در یکسری قابلیت ها) مثل:

  • 1. پشتیبانی نکردن از عملیات Asynchronous یا ناهمزمان؛ هر چند در جنگو یک دکوریتور (decorator) برای تبدیل view های sync به async وجود داره:
    @sync_to_async
    @api_view(["GET"])
    def sample_view(request: Request):
        data = get_data()
        return Response(data)
  • 2. ضعف در ارائه راه حل خوبی برای مسئله authentication (احراز هویت) هرچند تعداد زیادی third-party packages یا پکیج شخص ثالث کاربردی برای DRF توی مستندات خودش ارائه شده مثل dj-rest-auth
  • 3. پشتبانی نکردن از WebSocket
  • 4. nested serializer ها یا serializer های تودرتو جا برای بهتر شدن دارن

 

تقسیم بد وظایف

تقسیم بندی وظایف در DRF میتونست بهتر باشه که در اصطلاح میگیم Seperation of Concerns (SOC) بدی داره. لایه serialization در DRF وظایف بیش از حدی داره، وظایفی مثل:

  • 1. serializtion: به فرایندی گفته میشه که اطلاعاتی گرفته شده از Model رو به شکلی در بیاره که بشه اون رو به Client فرستاد
  • 2. data validation: بررسی صحت و درستی داده ها
  • 3. model creation: ساختن مدل های داده ای بر اساس داده های ورودی
  • 4. در برخی موارد دیده میشه که نحوه پردازش داده ها و منطق و logic برنامه در serializer ها پیاده سازی شده (معمولا در View ها نوشته میشه)

این باعث میشه که هم برای serializer ها و model ها اعتبارسنجی (validation) های جداگانه نوشته بشه که باعث پیچیدگی اضافی توی کد ها بشه (چون تکرار بی مورد رخ داده).

 

نتیجه گیری 

توی این مقاله مواردی که به نظرم برای آشنایی با DRF لازم بود رو بهتون گفتم اگر با جنگو آشنایی خوبی دارید و میخواید API بنویسید Django Rest Framework یک انتخاب عالیه چون تجربه توسعه سریعی رو به توسعه دهنده میده و اجازه ساخت RESTful API های استاندارد رو میده (اگر نمیدونید RESTful API چیه میتونید مقاله RESTful API چیست؟ رو مطالعه کنید) که در نتیجه باعث میشه توی روند توسعه به ارور و مشکلات کمتری توی API نویسی بر بخورید.

ولی یک مسئله که تله ای است که برنامه نویسان تازه کار داخل اون میفتن اینه که فک میکنن اگه از سریع ترین فریم ورک توی بنچمارک ها استفاده کنن پس سایت یا برنامه ای که قراره بسازن، سریع ترین برنامه است ولی واقعیت اینه که بیشتر performance و کارایی بالا توی برنامه های وب (اینجا منظور performance توی Back-End است) با بهینه سازی و کش کردن مناسب در دیتابیس بدست میاد و به تسلط خوب روی فریم ورک و تکنولوژی که داره استفاده میشه بستگی داره که به درستی پیاده سازی بشه تا بهترین نتیجه بدست بیاد.

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

author-avatar
سعید امینی
نویسنده مقاله

الان بیشتر از پنج ساله که مشغول برنامه نویسی وب هستم و در طول این مدت کلی چالش رو پشت سر گذاشتم و عاشق اینم که هر چیزی رو که در این مدت یاد گرفتم رو به بقیه هم یاد بدم، الانم در بستر سایت گیک باز دارم دانشم رو با بقیه تقسیم میکنم :)

نظرات

هنوز نظری وجود ندارد! شما اولین نفر باشید...