~3 دقیقه مطالعه • بروزرسانی ۲۳ اسفند ۱۴۰۴
مقدمه
در جنگو، یک ویو هر چیزی است که بتوان آن را فراخوانی کرد و در پاسخ به یک درخواست HTTP، یک پاسخ برگرداند. این ویو میتواند یک تابع باشد، اما جنگو امکان استفاده از کلاسها بهعنوان ویو را نیز فراهم میکند. ویوهای مبتنی بر کلاس (Class‑Based Views یا CBV) به شما اجازه میدهند کدهای قابلاستفاده مجدد بنویسید و از قدرت ارثبری و میکسینها بهره ببرید.
ویوهای پایه در جنگو
تمام ویوهای مبتنی بر کلاس از View ارث میبرند. این کلاس وظیفهٔ dispatch کردن درخواستها به متدهای مناسب (مثل get() یا post()) را بر عهده دارد.
چند ویوی پایهٔ مهم:
- View: پایهٔ تمام CBVها
- TemplateView: رندر کردن یک قالب
- RedirectView: انجام ریدایرکت
استفاده از CBV در URLconf
سادهترین روش استفاده از CBVها، فراخوانی مستقیم آنها در URLconf است:
urlpatterns = [
path("about/", TemplateView.as_view(template_name="about.html")),
]
هر آرگومانی که به as_view() بدهید، ویژگیهای کلاس را override میکند.
ارثبری و سفارشیسازی ویوها
روش قدرتمندتر استفاده از CBVها، ساخت زیرکلاس و override کردن ویژگیها یا متدهاست.
مثال: ساخت یک AboutView سفارشی
class AboutView(TemplateView):
template_name = "about.html"
و سپس در URLconf:
path("about/", AboutView.as_view()),
پشتیبانی از متدهای HTTP
CBVها بهصورت پیشفرض از متدهای HTTP مانند GET و POST پشتیبانی میکنند. اما میتوانید متدهای دیگری مثل HEAD را نیز اضافه کنید.
مثال: افزودن HEAD برای بهینهسازی API
class BookListView(ListView):
model = Book
def head(self, *args, **kwargs):
last_book = self.get_queryset().latest("publication_date")
return HttpResponse(headers={
"Last-Modified": last_book.publication_date.strftime(
"%a, %d %b %Y %H:%M:%S GMT"
)
})
در این حالت:
- GET → لیست کتابها را برمیگرداند
- HEAD → فقط هدر Last‑Modified را برمیگرداند
ویوهای ناهمگام (Async Class‑Based Views)
جنگو از ویوهای ناهمگام پشتیبانی میکند. کافی است متدهای ویو را با async def تعریف کنید.
مثال: یک ویوی ناهمگام
class AsyncView(View):
async def get(self, request, *args, **kwargs):
await asyncio.sleep(1)
return HttpResponse("Hello async world!")
نکتهٔ مهم:
- تمام متدهای ویو باید یا همگی async باشند یا همگی sync
- ترکیب def و async def باعث خطای ImproperlyConfigured میشود
مزایای استفاده از Class‑Based Views
- کاهش تکرار کد
- استفاده از ارثبری و میکسینها
- ساخت ویوهای قابلگسترش و قابلنگهداری
- پشتیبانی از متدهای HTTP مختلف
- امکان استفاده از async برای بهبود عملکرد
جمعبندی
ویوهای مبتنی بر کلاس در جنگو یک ابزار قدرتمند برای ساخت وباپلیکیشنهای تمیز، ساختیافته و قابلنگهداری هستند. با استفاده از View، TemplateView، RedirectView و قابلیتهایی مانند پشتیبانی از HEAD و async، میتوانید ویوهایی بسازید که هم انعطافپذیر باشند و هم عملکرد بالایی داشته باشند.
نوشته و پژوهش شده توسط دکتر شاهین صیامی