برای توسعهدهندگان پایتون، فریمورک Django REST (DRF) اغلب گزینهی اول برای ساخت APIهای وب قدرتمند و آمادهی تولید است. در حالی که خود Django یک فریمورک وب قدرتمند «همهچیز در یک بسته» است، DRF این قابلیت را با ارائهی یک ابزارکلاسمحور و بسیار انعطافپذیر برای ساخت APIهای وب گسترش میدهد. این راهنما بررسی میکند که چگونه میتوان از DRF بهطور مؤثر استفاده کرد و فراتر از عملیات پایهی CRUD رفت تا معماریهای API مقیاسپذیر، امن و قابل نگهداری را پیادهسازی نمود.
چرا Django REST Framework را انتخاب کنیم؟
قبل از غرق شدن در کدنویسی، درک این موضوع ضروری است که چرا DRF در اکوسیستم پایتون متمایز است. برخلاف ساخت یک REST API از صفر با استفاده از ویوهای عمومی (generic views) در Django، DRF پشتیبانی داخلی برای اصول اصلی REST، از جمله سریالایز (Serialization)، سیاستهای احراز هویت و مذاکره محتوا (Content Negotiation) ارائه میدهد. این فریمورک کدهای تکراری مورد نیاز برای مدیریت روشهای HTTP، کدهای وضعیت و چرخههای درخواست/پاسخ را انتزاع میکند و به توسعهدهندگان اجازه میدهد تا به جای تمرکز بر زیرساخت، بر منطق کسبوکار تمرکز کنند.
علاوه بر این، DRF بهصورت یکپارچه با ORM دیجانتیگ (Django ORM) ادغام میشود. این بدان معناست که اگر با مدلهای Django آشنایی دارید، میتوانید با کمترین اصطکاک به ساخت API بپردازید. این فریمورک همچنین مستندات گستردهای دارد و جامعهی کاربری بزرگی دارد که تضمین میکند راهحلهای مشکلات رایج بهراحتی در دسترس هستند.
تعریف سریالایزرها: پل ارتباطی بین مدلها و JSON
در DRF، سریالایزرها جزء حیاتی هستند که انواع دادهی پیچیده، مانند کوئریستها (querysets) و نمونههای مدل را به انواع دادهی بومی پایتون ترجمه میکنند که سپس میتوان آنها را بهراحتی به JSON تبدیل نمود. برعکس، آنها همچنین JSON ورودی را به دادههای دسریالایز شده (Deserialized) تبدیل میکنند.
سناریویی را در نظر بگیرید که یک مدل Book دارید. به جای نوشتن منطق تبدیل دستی، شما یک BookSerializer تعریف میکنید. این به شما اجازه میدهد دقیقاً کنترل کنید که کدام فیلدها در دسترس قرار میگیرند، چگونه اعتبارسنجی میشوند و چگونه روابط تو در تو مدیریت میشوند.
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', 'title', 'author', 'published_date', 'is_available']
def validate_title(self, value):
if len(value) < 5:
raise serializers.ValidationError("Title must be at least 5 characters long.")
return value
به استفاده از ModelSerializer توجه کنید که بهطور خودکار تعاریف فیلد را بر اساس مدل ایجاد میکند. ما همچنین یک روش اعتبارسنجی سفارشی به نام validate_title اضافه کردیم که نشان میدهد چگونه میتوان قوانین خاص کسبوکار را در لایهی سریالایز اعمال کرد.
استفاده از ViewSets و Routers
در حالی که ویوهای کلاسمحور عمومی مفید هستند، مفهوم ViewSet در DRF پیادهسازی منابع RESTful استاندارد را ساده میکند. یک کلاس ViewSet اساساً مجموعهای از ویوهاست که پیادهسازیهای پیشفرضی برای عملیات رایج مانند list (لیست کردن)، create (ایجاد)، retrieve (بازیابی)، update (بهروزرسانی) و destroy (حذف) ارائه میدهد.
با ترکیب ViewSets با یک Router، میتوانید پیکربندیهای URL را بهطور خودکار ایجاد کنید و بهطور چشمگیری مقدار کدهای اتصال (wiring code) را در فایل urls.py خود کاهش دهید.
from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
"""
A simple ViewSet for listing or retrieving books.
"""
queryset = Book.objects.all()
serializer_class = BookSerializer
در فایل urls.py خود، سپس این ویوست را ثبت میکنید:
from rest_framework.routers import DefaultRouter
from .views import BookViewSet
router = DefaultRouter()
router.register(r'books', BookViewSet)
urlpatterns = router.urls
احراز هویت و مجوزها
امنیت در توسعه API حیاتی است. DRF طیف گستردهای از کلاسهای احراز هویت، از جمله TokenAuthentication، JWT (توکنهای وب JSON) و OAuth2 را ارائه میدهد. بهطور پیشفرض، DRF دسترسی بدون احراز هویت به عملیات نوشتن را محدود میکند. شما میتوانید مجوزها را سفارشیسازی کنید تا اطمینان حاصل کنید که فقط کاربران مجاز میتوانند دادهها را تغییر دهند.
برای مثال، برای اطمینان از اینکه فقط سازندهی یک کتاب میتواند آن را ویرایش کند، میتوانید یک کلاس مجوز سفارشی ایجاد کنید:
from rest_framework.permissions import BasePermission
class IsOwnerOrReadOnly(BasePermission):
def has_object_permission(self, request, view, obj):
# Read permissions are allowed for any request
if request.method in SAFE_METHODS:
return True
# Write permissions are only allowed to the owner of the object
return obj.author == request.user
نتیجهگیری
فریمورک Django REST راهی قدرتمند، انعطافپذیر و امن برای ساخت APIهای RESTful در پایتون فراهم میکند. با تسلط بر سریالایزرها، ویوستها و مکانیزمهای احراز هویت، توسعهدهندگان میتوانند APIهایی ایجاد کنند که نه تنها کاربردی، بلکه مقیاسپذیر و قابل نگهداری باشند. با پیشروی در این مسیر، موضوعات پیشرفتهتری مانند صفحهبندی (Pagination)، فیلتر کردن و نسخهبندی API را برای ارتقای بیشتر کیفیت خدمات خود در نظر بگیرید.