
در این پست میخواهم درباره نحوه نوشتن یک view در Django صحبت کنم. برای اینکه بتوانیم یک صفحه در Django ایجاد کنیم، دو راه وجود دارد. سادهترین راه این است که از viewهای تابعی استفاده کنیم که به آنها Function-Based View یا به اختصار FBV میگویند. در ادامه یک نمونه کد ساده از آن را مشاهده میکنید:
# urls.py
from . import views
urlpatterns = [
path("", views.index, name="index"),
]
# views.py
from django.http import HttpResponse
def index(request):
html = "<html><body><strong>Hello, World!</strong></body></html>"
return HttpResponse(html)
همچنین میتوانیم کمی پیشرفتهتر عمل کنیم و درخواستهای GET و POST را جداگانه مدیریت کنیم. مانند کد زیر:
# views.py
from django.http import HttpResponse
def index(request):
if request.method == "GET":
html = "<html><body><strong>Hello, World!</strong></body></html>"
return HttpResponse(html)
راه دیگری که میتوانیم استفاده کنیم، نوشتن view به صورت کلاس است که به آن Class-Based View یا CBV میگویند. کد زیر یک نمونه ساده از آن است:
# urls.py
from . import views
urlpatterns = [
path("", views.Home.as_view(), name="index"),
]
# views.py
from django.views import View
from django.http import HttpResponse
class Home(View):
def get(self, request, *args, **kwargs):
html = "<html><body><strong>Hello, World!</strong></body></html>"
return HttpResponse(html)
در استفاده از CBVها، صحبت از مفهوم Object و Class میشود که امکانات بیشتری را برای ما فراهم میکنند. شاید تا اینجا چیزی جدیدی نبوده باشد، اما نکته اصلی که میخواهم به آن اشاره کنم این است که ما با CBVها میتوانیم از قابلیتهای بیشتری بهرهمند شویم.
به عنوان مثال، زمانی که یک درخواست به CBV ارسال میشود، قبل از اینکه متد get فراخوانی شود، چند تابع دیگر هم اجرا میشوند که با پیادهسازی آنها میتوانیم کد تمیزتر و قابل مدیریتی داشته باشیم. در ادامه به سه تابع کلیدی اشاره میکنم و کاربرد آنها را توضیح میدهم.
ابتدا کد زیر و خروجی کنسول را مشاهده کنید:
class Home(View):
def setup(self, request, *args, **kwargs):
print("setup function")
return super().setup(request, *args, **kwargs)
def dispatch(self, request, *args, **kwargs):
print("dispatch function")
return super().dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
print("get_context_data function")
context = {}
context["text"] = "<html><body><strong>Hello, World!</strong></body></html>"
context.update(kwargs)
return context
def get(self, request, *args, **kwargs):
print("GET function")
context = self.get_context_data()
html = context["text"]
return HttpResponse(html)
خروجی کنسول:
setup function
dispatch function
GET function
get_context_data function
همانطور که مشاهده میکنید، ابتدا تابع setup، سپس dispatch و در نهایت get فراخوانی میشوند. بهصورت خلاصه:
- setup برای مقداردهی اولیه و پردازشهای ابتدایی بهکار میرود.
- dispatch قبل از اجرای متدهای GET یا POST درخواست را مدیریت میکند.
- get_context_data محتوای مناسب برای نمایش در template را فراهم میکند.
با این سه متد میتوانیم کد مرتبتری بنویسیم. نظر شما چیست؟