~3 دقیقه مطالعه • بروزرسانی ۲۳ اسفند ۱۴۰۴
مقدمه
در جنگو، یک view هر تابع یا callableای است که یک درخواست HTTP را دریافت کرده و یک پاسخ برمیگرداند. اما جنگو علاوه بر نمایشهای تابعی، یک سیستم قدرتمند از نمایشهای مبتنی بر کلاس (Class-Based Views) ارائه میدهد که امکان استفاده از اصول شیءگرایی مانند ارثبری و mixinها را فراهم میکند. این ساختار باعث افزایش قابلیت استفاده مجدد و سازماندهی بهتر کد میشود.
نمایشهای مبتنی بر کلاس چیست؟
تمام CBVها از کلاس پایه View ارث میبرند. این کلاس مسئول مدیریت dispatch متدهای HTTP، اتصال view به URLها و ارائه امکانات مشترک است. جنگو همچنین مجموعهای از نمایشهای عمومی (Generic Views) را برای کارهای رایج مانند نمایش قالب یا لیست اشیا فراهم کرده است.
نمونههای پایه از CBVهای داخلی
View: کلاس پایه تمام CBVها.RedirectView: ایجاد پاسخ HTTP Redirect.TemplateView: رندر یک قالب HTML.
استفاده از CBV در URLconf
سادهترین روش استفاده از CBVها، فراخوانی as_view() در فایل URLconf است:
from django.urls import path
from django.views.generic import TemplateView
urlpatterns = [
path("about/", TemplateView.as_view(template_name="about.html")),
]
پارامترهای ارسالشده به as_view() ویژگیهای کلاس را override میکنند.
زیرکلاسسازی نمایشهای عمومی
روش قدرتمندتر، ایجاد یک زیرکلاس از یک CBV موجود و override کردن ویژگیها یا متدهاست. مثال:
# some_app/views.py
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name = "about.html"
و سپس در URLconf:
from django.urls import path
from some_app.views import AboutView
urlpatterns = [
path("about/", AboutView.as_view()),
]
پشتیبانی از متدهای HTTP دیگر
CBVها امکان تعریف متدهای مختلف HTTP مانند get()، post()، put() و head() را فراهم میکنند. مثال زیر نحوه استفاده از HEAD برای بهینهسازی API را نشان میدهد:
from django.http import HttpResponse
from django.views.generic import ListView
from books.models import Book
class BookListView(ListView):
model = Book
def head(self, *args, **kwargs):
last_book = self.get_queryset().latest("publication_date")
response = HttpResponse(
headers={
"Last-Modified": last_book.publication_date.strftime(
"%a, %d %b %Y %H:%M:%S GMT"
)
}
)
return response
درخواست GET لیست کامل کتابها را برمیگرداند، اما درخواست HEAD تنها هدر Last-Modified را ارسال میکند.
نمایشهای ناهمگام (Asynchronous Views)
جنگو از نمایشهای ناهمگام با استفاده از async def پشتیبانی میکند. این قابلیت برای عملیات I/O مانند درخواستهای API بسیار مفید است:
import asyncio
from django.http import HttpResponse
from django.views import View
class AsyncView(View):
async def get(self, request, *args, **kwargs):
await asyncio.sleep(1)
return HttpResponse("Hello async world!")
نکته مهم: تمام متدهای یک CBV باید یا همگی synchronous باشند یا همگی asynchronous. ترکیب این دو باعث بروز خطای ImproperlyConfigured میشود.
جمعبندی
نمایشهای مبتنی بر کلاس در جنگو یک ابزار قدرتمند برای ساختاردهی بهتر کد، استفاده مجدد از منطق، و مدیریت آسانتر درخواستهای HTTP هستند. با استفاده از ارثبری، override کردن متدها، پشتیبانی از متدهای مختلف HTTP و قابلیت async، میتوان نمایشهایی حرفهای، مقیاسپذیر و قابل نگهداری ایجاد کرد.
نوشته و پژوهش شده توسط دکتر شاهین صیامی