Django

⌘K
  1. Home
  2. Django
  3. Django তে কিভাবে কাজ করতে...
  4. middleware
  5. ৬. django এর CommonMiddleware সম্পর্কে বিস্তারিত

৬. django এর CommonMiddleware সম্পর্কে বিস্তারিত

Django-র CommonMiddleware হলো একটি শক্তিশালী মিডলওয়্যার যা ওয়েব অ্যাপ্লিকেশনের সঠিকতা ও সুরক্ষা নিশ্চিত করতে বিভিন্ন সাধারণ ফাংশন সরবরাহ করে। এটি Django-র settings.py ফাইলে MIDDLEWARE তালিকায় অন্তর্ভুক্ত থাকে এবং প্রাথমিকভাবে বিভিন্ন সাধারণ কাজ সম্পাদন করতে ব্যবহৃত হয়, যেমন URL-কে নির্দিষ্ট ফরম্যাটে রিডাইরেক্ট করা, বন্ধুত্বপূর্ণ URL এবং ব্রাউজার কম্প্যাটিবিলিটি বৃদ্ধি করা।

Django-তে CommonMiddleware ডিফল্টভাবেই থাকে, কিন্তু এর ভেতরের কিছু সেটিংস ম্যানুয়ালি কনফিগার করতে হয়। কারণ, Django এমনভাবে ডিজাইন করা হয়েছে যেন এটি যেকোনো ধরনের ওয়েব অ্যাপ্লিকেশনে ব্যবহার করা যায়—ছোট-বড় যেকোনো প্রজেক্টেই। Django যদি CommonMiddleware-র সমস্ত সেটিংস ডিফল্টভাবে একভাবে সক্রিয় করে দিত, তবে কিছু অ্যাপ্লিকেশনে হয়তো ভালো কাজ করলেও অনেক অ্যাপ্লিকেশনে এটি সমস্যা তৈরি করতে পারত।


CommonMiddleware কীভাবে কাজ করে?

CommonMiddleware Django-তে ব্যবহারকারীর পাঠানো প্রতিটি রিকোয়েস্টে কাজ করে। যখনই কোনো ব্যবহারকারী Django-তে একটি রিকোয়েস্ট পাঠায়, এই middleware বিভিন্ন সাধারণ যাচাই ও পরিবর্তন সম্পাদন করে যাতে রিকোয়েস্টটি সঠিকভাবে প্রসেস করা যায়। এটি কনফিগারেশন অনুযায়ী URL গুলোকে সঠিকভাবে ফরম্যাট করে এবং কিছু নিরাপত্তা-সম্পর্কিত বিষয়েও অবদান রাখে।

Django-এর CommonMiddleware-এর বিভিন্ন সেটিংস কনফিগার করা হলে কিভাবে কাজ করে তা নিচে উদাহরণসহ ব্যাখ্যা করা হলো। এর প্রতিটি ফিচার একটি নির্দিষ্ট প্রয়োজনে কাজে লাগে এবং এদেরকে সঠিকভাবে কনফিগার করা না হলে প্রকৃত সুবিধাগুলি পাওয়া যায় না।


১. APPEND_SLASH সেটিং

APPEND_SLASH: এটি একটি Boolean (True/False) সেটিং। যখন এটি True থাকে, তখন কোনো URL-এর শেষে যদি / না থাকে এবং Django সেই URL-এর সাথে মেলে এমন কোনো পৃষ্ঠা খুঁজে না পায়, তাহলে CommonMiddleware সেই URL-কে স্বয়ংক্রিয়ভাবে / যুক্ত করে সংশোধন করে।

# settings.py
MIDDLEWARE = [
    ...
    'django.middleware.common.CommonMiddleware',
    ...
]

# অ্যাডজাস্টিং APPEND_SLASH
APPEND_SLASH = True

গল্পের প্রেক্ষাপট:

সোহেল একজন ব্যবহারকারী এবং সে https://tutorial.rebelsoftt.com/contact টাইপ করে সাইটে প্রবেশ করতে চায়। কিন্তু পৃষ্ঠাটির URL /contact/, তাই APPEND_SLASH True থাকায় Django স্বয়ংক্রিয়ভাবে তাকে https://tutorial.rebelsoftt.com/contact এ রিডাইরেক্ট করে, ফলে সোহেল তার কাঙ্ক্ষিত পৃষ্ঠাটি দেখতে পায়।

২. PREPEND_WWW সেটিং

PREPEND_WWW: এই সেটিংটি True করলে, CommonMiddleware স্বয়ংক্রিয়ভাবে প্রতিটি URL-এর শুরুতে www যোগ করে। এটি URL-এর ঐক্য নিশ্চিত করতে এবং SEO-র জন্য সহায়ক হতে পারে।

ডিফল্ট: False

উদাহরণ:

যদি PREPEND_WWW True থাকে এবং ব্যবহারকারী https://tutorial.rebelsoftt.com/ টাইপ করেন, Django তাকে স্বয়ংক্রিয়ভাবে https://www.tutorial.rebelsoftt.com/ এ রিডাইরেক্ট করবে।

# settings.py
MIDDLEWARE = [
    ...
    'django.middleware.common.CommonMiddleware',
    ...
]

# অ্যাডজাস্টিং PREPEND_WWW
PREPEND_WWW = True

গল্পের প্রেক্ষাপট:

সোহেল তার ব্রাউজারে tutorial.rebelsoftt.com টাইপ করে। তবে, PREPEND_WWW True থাকার কারণে, Django স্বয়ংক্রিয়ভাবে তাকে www.tutorial.rebelsoftt.com এ নিয়ে যায়, ফলে সাইটের সব URL একই ফরম্যাটে থাকে এবং SEO ফলাফলে সহায়ক হয়।

৩. DISALLOWED_USER_AGENTS সেটিং

DISALLOWED_USER_AGENTS: এটি একটি তালিকা যেখানে এমন কিছু user-agent উল্লেখ করা হয় যেগুলোকে সাইটে অ্যাক্সেস করতে নিষেধ করা হয়। এটি সাধারণত অনাকাঙ্ক্ষিত বট ও স্ক্র্যাপারদের রিকোয়েস্ট বন্ধ করতে ব্যবহৃত হয়।

উদাহরণ:

ধরুন, আপনি চান কোনো স্ক্র্যাপার বা বট BadBot নামে একটি user-agent ব্যবহার করে সাইটে প্রবেশ করতে না পারে। তখন সেটিকে DISALLOWED_USER_AGENTS-এ যোগ করা যায়।

# settings.py
from django.urls import re_path
import re

MIDDLEWARE = [
    ...
    'django.middleware.common.CommonMiddleware',
    ...
]

# Adding disallowed user agents
DISALLOWED_USER_AGENTS = [
    re.compile(r'BadBot'),
]

গল্পের প্রেক্ষাপট:

তানভীর একজন হ্যাকার এবং সে একটি স্ক্র্যাপার ব্যবহার করে সাইটের ডেটা সংগ্রহ করতে চায়। Django তে DISALLOWED_USER_AGENTS সেটিং ব্যবহার করে সেই স্ক্র্যাপারের user-agent ব্লক করা হয়েছে। ফলে, তানভীর আর সাইটে প্রবেশ করতে পারছে না এবং তার কার্যকলাপ থেমে যায়।

৪. IGNORE_ABSOLUTE_URL_OVERRIDES সেটিং

IGNORE_ABSOLUTE_URL_OVERRIDES: এটি একটি Boolean সেটিং। কোনো মডেলের get_absolute_url() মেথডকে যদি কোনো ফাংশন বা বিশেষ URL দিয়ে ওভাররাইড করতে হয় তবে এটি True করে ব্যবহার করা হয়।

ডিফল্ট: False

উদাহরণ:

ধরুন, আপনার একটি মডেল রয়েছে যেখানে আপনি চাইছেন প্রতিটি অবজেক্ট একটি নির্দিষ্ট URL পাবে, যা get_absolute_url মেথড দিয়ে কনফিগার করা হয়েছে। তবে আপনি যদি এ URL পরিবর্তন করতে চান এবং সেটিং Ignore করলে URL একই থাকবে।

# settings.py
MIDDLEWARE = [
    ...
    'django.middleware.common.CommonMiddleware',
    ...
]

# Adjusting IGNORE_ABSOLUTE_URL_OVERRIDES
IGNORE_ABSOLUTE_URL_OVERRIDES = True

গল্পের প্রেক্ষাপট:

নুসরাত Django অ্যাপ্লিকেশনে একটি কাস্টম URL রিডাইরেক্ট তৈরি করেছে। Django তে IGNORE_ABSOLUTE_URL_OVERRIDES True থাকায়, Django তার মডেলের get_absolute_url() মেথডের ওভাররাইড এড়িয়ে যায় এবং নিজের তৈরি কাস্টম URL ব্যবহার করে। এতে করে নির্দিষ্ট নিয়মে কাস্টমাইজড URL দিয়ে ডাটা ফ্লো মেইনটেইন করতে নুসরাত সফল হয়।

How can we help?