What is Django Views

Django তে Views কি?

Django Views Complete Tutorial
Django Views Complete Tutorial

Django তে views হল Django এর MVT Structure এর অন্যতম গুরুত্বপূর্ণ পার্ট। Django Documentation অনুসারে, একটি view ফাংশন হল একটি পাইথন ফাংশন যা একটি Web request গ্রহণ করে এবং একটি Web response রিটার্ন করে। এই response টি একটি Web page এর HTML contents হতে পারে, বা একটি redirect, বা একটি 404 error, বা একটি XML document, বা একটি image, ওয়েব ব্রাউজার প্রদর্শন করতে পারে এমন কিছু হতে পারে৷

আরো সহজ করলে বললে , Django তে, “view” হল একটি Python function যা একটি web request নেয় এবং একটি web response প্রদান করে। ভিউ হল Django এর HTTP requests এবং responses গুলি পরিচালনার কেন্দ্রবিন্দু।

যখন একজন ইউজার Django-চালিত সাইটে একটি page requests করে, তখন Django প্রথমে একটি matching URL pattern সন্ধান করে। যদি কাঙ্খিত URL টি খুঁজে পায়, Django তারপর সংশ্লিষ্ট view function টিকে কল করে, এটিকে তার first argument হিসাবে request object টি পাস করে।

view ফাংশন তারপরে যা কিছু প্রসেসিং করার প্রয়োজন তা প্রসেস করে, সাধারণত ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করে বা কিছু কম্পুটাশন সম্পাদন করে এবং একটি HttpResponse object রিটার্ন করে যা ইউজারের web browser এ ফেরত পাঠানো হবে।

এছাড়া Views অতিরিক্ত arguments ও নিতে পারে, যেমন URL parameters বা ইউজারের সাবমিট করা form data, এবং HTML, JSON এবং PDF সহ বিভিন্ন ফর্ম্যাটে response সমূহ তৈরি করতে বিভিন্ন Django tools সমূহ এবং API ব্যবহার করতে পারে।

সামগ্রিকভাবে, views হচ্ছে Django এর সাথে web applications তৈরির একটি ফান্ডামেন্টাল পার্ট , এবং অন্তর্নিহিত ডেটা মডেল এবং বিজনেস লজিক থেকে প্রেজেনটেশন লজিক কে আলাদা করার একটি key component.

django views এর class এবং function গুলো আপনার তৈরি app ফোল্ডারের মধ্যে অবস্থিত views.py ফাইলে থাকে।

django Views
django Views

Web Development, Data Science and Big Data Course with Python, MongoDB, MySQL and Django

Django তে Views কত ধরণের?

Django তে Views গুলো মূলত দুই ধরণের:

  • function-based views (FBVs)
  • class-based views (CBVs)

1. function-based views (FBVs) কি?

function-based views (FBVs) হল একজন Django Developer একেকটি View এর জন্য একেকটি Python Function ব্যবহার করবে, যা একটি argument কে HttpRequest object হিসাবে গ্রহণ করে এবং একটি HttpResponse object return করে।

function-based views (FBVs) গুলি তাদের প্রথম argument হিসাবে একটি HTTP request গ্রহণ করে এবং সাধারণত একটি HTTP response object রিটার্ন করে।

নিম্নে Django তে খুবই সাধারণ function-based views (FBVs) এর একটি উদাহরণ দেওয়া হলো :

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello, world!")

এই view টি কেবল একটি plain text “Hello, world!” কে HTTP response হিসাবে রিটার্ন করবে।

function-based views (FBVs) অতিরিক্ত arguments ও গ্রহণ করতে পারে, যেমন URL parameters বা ইউজারের সাবমিট দেওয়া ফর্ম থেকে ডেটা। উদাহরণস্বরূপ, এখানে একটি view যা URL-এ একটি “name” প্যারামিটার আশা করে এবং এটি একটি ব্যক্তিগত অভিবাদন তৈরি করতে ব্যবহার করে:

from django.http import HttpResponse

def greet(request, name):
    return HttpResponse(f"Hello, {name}!")

Note:উপরের দুটি উদাহরণের (যথাক্রমে http://localhost:8000/hello এবং http://localhost:8000/greet/Masud ) আউটপুট ব্রাউজারে দেখতে চাইলে আপনার app folder এর মধ্যে অবস্থিত urls.py তে নিম্নোক্ত কোড গুলো যুক্ত করে দিতে হবে :

from django.urls import path
from . import views

urlpatterns = [
    path('hello/', views.hello, name='hello'),
    path('greet/<str:name>/', views.greet, name='greet'),
]

Django তে function-based views (FBVs) কত ধরণের?

জ্যাঙ্গোতে, প্রধানত দুটি ধরণের function-based views (FBVs) রয়েছে:

  • ১. Simple function-based views (FBVs):
  • ২. Decorator function-based views (FBVs):

১. Simple function-based views (FBVs):

একটি Simple function-based views (FBVs) হল একটি পাইথন ফাংশন যা একটি HttpRequest অবজেক্টকে তার প্রথম প্যারামিটার হিসাবে নেয় এবং একটি HttpResponse অবজেক্ট প্রদান করে। এই ধরনের View তৈরি করা এবং বোঝা সহজ, কিন্তু আপনার অ্যাপ্লিকেশন বৃদ্ধির সাথে সাথে এটি দ্রুত অপ্রয়োজনীয় হয়ে উঠতে পারে।

এখানে একটি simple function-based views (FBVs) এর উদাহরণ দেওয়া হলো:

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello, world!")

Web Development, Data Science and Big Data Course with Python, MongoDB, MySQL and Django

২. Decorator function-based views (FBVs):

জ্যাঙ্গোতে Decorator function-based views (FBVs) গুলি এমন ফাংশন যা অতিরিক্ত ফাঙ্কশনালিটি যোগ করার জন্য ব্যবহৃত হয়। অন্য কথায়, ডেকোরেটর হল একটি function এর আচরণ পরিবর্তন বা উন্নত করার একটি উপায়।

জ্যাঙ্গো views এর পরিপ্রেক্ষিতে, ডেকোরেটরগুলি View তে সাধারণ ফাঙ্কশনালিটি যোগ করতে ব্যবহার করা যেতে পারে, যেমন authentication, caching, permission checking এবং আরও অনেক কিছু। Decorator-based views গুলি পুনরায় ব্যবহারযোগ্য views তৈরি করতে ব্যবহার করা যেতে পারে যা একাধিক অ্যাপ্লিকেশন জুড়ে শেয়ার করা যেতে পারে।

জ্যাঙ্গোতে views এর জন্য বেশ কয়েকটি বিল্ট-ইন decorators সরবরাহ করে, যার মধ্যে রয়েছে:

  • @login_required: view তে অ্যাক্সেস করার জন্য ইউজারকে authenticated করতে হবে।
  • @cache_page:পারফরমেন্স উন্নত করতে একটি নির্দিষ্ট সময়ের জন্য response কে ক্যাশ করে।
  • @csrf_exempt: Cross-Site Request Forgery (CSRF) থেকে view কে সুরক্ষা দেয়।
  • @permission_required: view অ্যাক্সেস করার জন্য ইউজারের একটি নির্দিষ্ট অনুমতি থাকা প্রয়োজন।

ভিউতে অতিরিক্ত ফাঙ্কশনালিটি যোগ করতে আপনি আপনার নিজস্ব custom decorator ও তৈরি করতে পারেন।

এখানে একটি Decorator function-based views (FBVs) এর উদাহরণ দেওয়া হলো:

তবে তার আগে প্রথমে আপনাকে Django Framework এর admin (http://localhost:8000/admin/) এ এক্সেস এর জন্য প্রয়োজনীয় table গুলো তৈরির জন্য নিম্নোক্ত কমান্ডের মাধ্যমে Migrate এর কাজটি করতে হবে :

python manage.py migrate

যদি সবগুলো Table Successfully Migrate হয় , তাহলে নিম্নোক্ত কমান্ডের মাধ্যমে Django Admin Access এর জন্য একটি super user তৈরি করে নিতে হবে।

python manage.py createsuperuser

এবার চলুন test নামে একটি view তৈরি করে ফেলি।

from django.contrib.auth.decorators import login_required
from django.shortcuts import render

@login_required
def test(request):
    # View code here...
    context = {
        'name': 'John',
        'age': 25
    }
    return render(request, 'my_template.html', context)

এই উদাহরণে, আমরা test নামে একটি view function সংজ্ঞায়িত করেছি যার অ্যাক্সেসের জন্য authentication প্রয়োজন। আমরা @login_required ডেকোরেটরের সাথে view ফাংশন সাজিয়ে এটি করেছি।

যখন একজন ব্যবহারকারী এই view টি অ্যাক্সেস করার চেষ্টা করেন, তখন জ্যাঙ্গো যাচাই করবে যে তারা authenticated কিনা। যদি তারা authenticated হয়, view টি নরমাল হিসাবে execute হবে এবং কিছু context variables সহ একটি রেন্ডার করা টেমপ্লেট রিটার্ন দেবে। যদি তারা authenticated না হয়, জ্যাঙ্গো তাদেরকে লগইন পৃষ্ঠায় redirect করবে।

render function টি context variables সহ একটি template render করতে ব্যবহৃত হয়। এই উদাহরণে, আমরা প্রজেক্টের templates ফোল্ডারের মধ্যে my_template.html নামে একটি টেমপ্লেট রেন্ডার করছি এবং এটিকে context ভেরিয়েবলের একটি dictionary পাস করছি যাতে ইউজারের name এবং age অন্তর্ভুক্ত থাকে।

এবার আপনার মূল প্রজেক্ট ফোল্ডারের মধ্যে templates নামে একটি ফোল্ডার তৈরি করুন এবং settings.py ফাইলের ৫৮ নম্বর লাইনে নিচের মতো করে ফোল্ডারটিকে রেজিস্ট্রি করে দিন :

Django Template Directory Registration
Django Template Directory Registration

এবার সদ্য তৈরি করা templates ফোল্ডারের মধ্যে my_templates.html নামে একটি ফাইল তৈরি করুন , এবং নিম্নের কোডগুলো যুক্ত করে দিন :

<!DOCTYPE html>
<html>
<head>
    <title>My Template</title>
</head>
<body>
    <h1>Welcome, {{ name }}!</h1>
    <p>You are {{ age }} years old.</p>
</body>
</html>

এই template এ , আমরা view থেকে পাস করা name এবং age context ভেরিয়েবল আউটপুট করতে জ্যাঙ্গোর template language ব্যবহার করছি।

সর্বশেষ urls.py তে নিচের মতো করে URL route টি বলে দিন :

from django.urls import path
from . import views

urlpatterns = [
   path('test/', views.test, name='test'),
]

এখন যদি আপনি django admin এ লগইন অবস্থায় থাকেন , তারপর যদি http://localhost:8000/test url এ যান , তাহলে আপনি এই টেম্পলেট ফাইলের আউটপুট দেখতে পাবেন

২. class-based views (CBVs) কি?

class-based views (CBVs) ফাংশনের পরিবর্তে একজন Django Developer একেকটি View এর জন্য একেকটি Python Class ব্যবহার করবে, যা Python objects হিসেবে View implement এর একটি বিকল্প উপায় প্রদান করে। যদিও class-based views (CBVs) গুলো function-based views (FBVs) গুলিকে প্রতিস্থাপন করে না, তবে function-based views (FBVs) গুলির সাথে তুলনা করার সময় class-based views (CBVs) এর কিছু পার্থক্য এবং সুবিধা রয়েছে:

  • নির্দিষ্ট HTTP method গুলো (GET, POST, ইত্যাদি) সম্পর্কিত কোডের সংগঠনকে conditional branching এর পরিবর্তে পৃথক method সমূহ দ্বারা ব্যবহার করা যেতে পারে।
    Object oriented technique গুলো যেমন mixins (multiple inheritance) কোডকে পুনরায় ব্যবহারযোগ্য components গুলিকে পুনর্ব্যবহার যোগ্য করতে ব্যবহার করা যেতে পারে।
  • class-based views (CBVs) গুলি function-based views (FBVs) গুলির চেয়ে ম্যানেজ করা সহজ এবং ইফিসিয়েন্ট। শত শত লাইন যুক্ত কোডের একটি function-based views (FBVs) কে শুধুমাত্র কয়েকটি লাইন দিয়ে class-based views (CBVs) এ রূপান্তর করা যেতে পারে। এখানেই অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং এর দারুন এডভান্টেজ।

নিম্নে class-based views (CBVs) এর একটি উদাহরণ দেওয়া হলো:

from django.shortcuts import render
from django.views import View
from django.http import HttpResponse

class MyView(View):
    def get(self, request):
        return HttpResponse("Hello, World!")

উপরের উদাহরণে, আমরা MyView নামক একটি class-based views (CBVs) সংজ্ঞায়িত করি যা জ্যাঙ্গোর view class থেকে ইনহেরিটেড। এবং এই MyView class এর মধ্যে একটি get method সংজ্ঞায়িত করি যা “Hello, World!” text সহ একটি সাধারণ HTTP response রিটার্ন করে।

class-based views (CBVs) এ তার Method গুলোতে অতিরিক্ত arguments ও গ্রহণ করতে পারে, যেমন URL parameters বা ইউজারের সাবমিট দেওয়া ফর্ম থেকে ডেটা। উদাহরণস্বরূপ, এখানে একটি view যা URL-এ একটি “name” প্যারামিটার আশা করে এবং এটি একটি ব্যক্তিগত অভিবাদন তৈরি করতে ব্যবহার করে:

from django.shortcuts import render
from django.views import View
from django.http import HttpResponse

class GreetView(View):
    def get(self, request, name):
        return HttpResponse(f"Hello, {name}!")
    

এই উদাহরণে, আমাদের কাছে GreetView নামে class-based views (CBVs) রয়েছে যা এর URL pattern এ একটি অতিরিক্ত আর্গুমেন্টের নাম নেয়। আমাদের get Method বা post Method গুলোতে এই name Argument এ অ্যাক্সেস করতে, আমরা request parameter এর পরে এটিকে একটি parameter হিসাবে অন্তর্ভুক্ত করি।

Note:উপরের দুটি উদাহরণের (যথাক্রমে http://localhost:8000/myview এবং http://localhost:8000/greet/Masud ) আউটপুট ব্রাউজারে দেখতে চাইলে আপনার app folder এর মধ্যে অবস্থিত urls.py তে নিম্নোক্ত কোড গুলো যুক্ত করে দিতে হবে :

from django.urls import path
from . import views
from . views import MyView
from .views import GreetView

urlpatterns = [
   path('myview/', MyView.as_view(), name='myview'),
   path('greet/<str:name>/', GreetView.as_view(), name='greet'),
]

Django তে class-based views (CBVs) কত ধরণের?

জ্যাঙ্গোতে, প্রধানত দুটি ধরণের class-based views (CBVs) রয়েছে:

  • ১. Simple class-based views (CBVs):
  • ২. Decorator class-based views (CBVs):

Web Development, Data Science and Big Data Course with Python, MongoDB, MySQL and Django

১. Simple class-based views (CBVs):

জ্যাঙ্গোতে, Simple Class-Based Views (CBVs) হল built-in view গুলির একটি সেট যা সাধারণ ব্যবহারের ক্ষেত্রে রান করার জন্য common functionality প্রদান করে। Simple Class-Based Views (CBVs) গুলি custom view function গুলি লেখার জন্য একটি সহজ এবং আরও পুনঃব্যবহারযোগ্য বিকল্প হিসাবে তৈরি করা হয়েছে।

Simple Class-Based Views (CBVs) গুলিকে পাইথন ক্লাস হিসাবে সংজ্ঞায়িত করা হয় যা django এর generic view class ক্লাসগুলির একটি থেকে উত্তরাধিকারসূত্রে প্রাপ্ত। এই ক্লাসগুলি common HTTP methods গুলির জন্য ডিফল্ট বাস্তবায়ন প্রদান করে যেমন get, post, put, এবং delete, এবং এই methods গুলিকে override করে বা অতিরিক্ত methods যোগ করে সহজেই কাস্টমাইজ করা যায়।

এখানে জ্যাঙ্গোতে একটি simple CBV এর একটি উদাহরণ দেওয়া হলো:

from django.views.generic import TemplateView

class HomePageView(TemplateView):
    template_name = 'home.html'

এই উদাহরণে, HomePageView হল একটি simple CBV যা TemplateView থেকে inherits সূত্রে প্রাপ্ত, একটি generic view class যা একটি template রেন্ডার করে। template_name attribute টি টেমপ্লেটের name উল্লেখ করে যা রেন্ডার করা উচিত।

এবার চলুন এটিকে একটি নির্দিষ্ট URL-এর সাথে ভিউ যুক্ত করতে আপনার urls.py ফাইলে একটি URL প্যাটার্ন যোগ করতে পারেন:

from django.urls import path
from .views import HomePageView

urlpatterns = [
    path('', HomePageView.as_view(), name='home'),
]

এই উদাহরণে,empty string “” সাইটের root URL এর সাথে মেলে, এবং HomePageView.as_view() কে ক্লাসটিকে একটিview function এ রূপান্তর করতে বলা হয় যা request টি পরিচালনা করতে ব্যবহার করা যেতে পারে। name argument টি অপশনাল, কিন্তু বিপরীত URL লুকআপের জন্য উপযোগী হতে পারে।

২. Decorator class-based views (CBVs):

জ্যাঙ্গোতে Decorator Class-Based Views (CBVs) হল এক বা একাধিক ডেকোরেটরে মোড়ানোর মাধ্যমে class-based view তে ফাঙ্কশনালিটি যোগ করার একটি উপায়। Decorator হল এমন function যা একটি view function কে argument হিসেবে নেয় এবং একটি নতুনview function ফেরত দেয় যা কিছু behavior যোগ করে বা আসল view function এর behavior পরিবর্তন করে।

Decorator CBVs গুলি জ্যাঙ্গোতে method_decorator function ব্যবহার করে এক বা একাধিক Decorator কে class-based view এর methods এ প্রয়োগ করার মাধ্যমে প্রয়োগ করা হয়। method_decorator ফাংশন হল একটি utility function যা decorate করার জন্য একটি decorator এবং method এর নাম নেয় এবং একটি নতুন method রিটার্ন করে যা method এ প্রয়োগ করা যেতে পারে।

এখানে জ্যাঙ্গোতে একটি decorator CBV এর একটি উদাহরণ দেওয়া হলো:

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView

@method_decorator(login_required, name='dispatch')
class ProtectedView(TemplateView):
    template_name = 'protected.html'

এই উদাহরণে, method_decorator Function ব্যবহার করে ProtectedView ক্লাসের dispatch method এ @login_required decorator প্রয়োগ করা হয়েছে। এটি নিশ্চিত করে যে শুধুমাত্র authenticated ইউজারের এই view টি অ্যাক্সেস করতে পারবে ।

এবার চলুন এটিকে একটি নির্দিষ্ট URL-এর সাথে ভিউ যুক্ত করতে আপনার urls.py ফাইলে একটি URL প্যাটার্ন যোগ করতে পারেন:

from django.urls import path
from .views import ProtectedView

urlpatterns = [
    path('protected/', ProtectedView.as_view(), name='protected'),
]

এই উদাহরণে, URL প্যাটার্ন /protected/ ProtectedView ক্লাসের সাথে যুক্ত, যেটিতে @login_required decorator প্রয়োগ করা হয়েছে। এটি নিশ্চিত করে যে শুধুমাত্র authenticated ইউজাররা এই protected view তে অ্যাক্সেস করতে পারে।

Web Development, Data Science and Big Data Course with Python, MongoDB, MySQL and Django

function-based views (FBVs) এবং class-based views (CBVs) এর মধ্যে পার্থক্য কি?

function-based views (FBVs) এবং class-based views (CBVs) এর মধ্যে পার্থক্য গুলো নিম্নে আলোচনা করা হলো :

১. Implementation: FBV গুলি functions হিসাবে প্রয়োগ করা হয়, যেখানে CBV গুলি classes হিসাবে প্রয়োগ করা হয়।

২. Reusability: CBV গুলি সাধারণত FBV-এর তুলনায় বেশি পুনঃব্যবহারযোগ্য কারণ একই ধরনের ফাঙ্কশনালিটি সহ নতুন views তৈরি করার জন্য সেগুলিকে subclass এবং override করা যেতে পারে। অন্যদিকে, FBV গুলি হল স্বতন্ত্র ফাংশন যা অন্য views থেকে কল করে পুনরায় ব্যবহার করা যেতে পারে।

৩. Code organization: CBV গুলি আপনার কোডকে আরও কার্যকরভাবে organize করতে সাহায্য করতে পারে, কারণ আপনি একটি base class এ সাধারণ ফাঙ্কশনালিটি সংজ্ঞায়িত করতে পারেন এবং তারপরে আরও নির্দিষ্ট আচরণের সাথে subclass তৈরি করতে পারেন। অন্য দিকে, FBVs, যদি আপনাকে একাধিক ভিউ জুড়ে একই ধরনের ফাঙ্কশনালিটি পুনরাবৃত্তি করতে হয় তবে আরও কোড ডুপ্লিকেশন হতে পারে।

৪. Functionality: CBV গুলো FBV-এর তুলনায় out-of-the-box functionality বিস্তৃত পরিসর প্রদান করে, যার মধ্যে generic views (যেমন ListView, DetailView ইত্যাদি) এর জন্য built-in support সহ যা common use cases এর ক্ষেত্রে ব্যবহার করা যেতে পারে যেমন objects List প্রদর্শন করা বা স্বতন্ত্র objects । অন্যদিকে, FBVs, এই ধরনের কাজের জন্য আরও ম্যানুয়াল বাস্তবায়নের প্রয়োজন।

৫.Testing: FBV গুলি test করা সহজ হতে পারে কারণ সেগুলি স্বতন্ত্র ফাংশন যা অন্যান্য views থেকে স্বাধীনভাবে test করা যেতে পারে। অন্যদিকে, CBV-গুলির জন্য আরও complex testing সেটআপের প্রয়োজন হতে পারে কারণ সেগুলি ক্লাস হিসাবে প্রয়োগ করা হয়।

সামগ্রিকভাবে, FBV এবং CBV উভয়েরই নিজস্ব strengths এবং weaknesses রয়েছে এবং তাদের মধ্যে পছন্দটি মূলত আপনার application এর নির্দিষ্ট চাহিদার উপর নির্ভর করে।

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

Leave a Reply