Have an account? Sign in

ইউআরএল কনফিগারেশন ইন ডেপথ

Last updated last month

আমাদের myapp এর ভিউগুলো এক্সেস করতে যে ইউআরএল ভিজিট করতে হয় সেগুলো আমরা myproject প্রোজেক্ট ফোল্ডার এর ভিতরের urls.py তে রেখেছি! এবং আমরা আগেই জেনেছি যে জ্যাঙ্গোতে প্রোজেক্টগুলো ছোট ছোট এপ এ ভাগ করা থাকে, আমাদের প্রোজেক্টে যদিও এখন পর্যন্ত একটা মাত্র এপ আছে, কিন্তু প্রোজেক্ট বড় হলে সেখানে অনেকগুলো এপ তৈরি করতে হয়।

এখন সবগুলো এপস এর ইউআরএল গুলো যদি সেই মেইন প্রোজেক্ট ফোল্ডারের ulrs.py তে রাখি তাহলে ফাইলটা অনেক বড় এবং বিদঘুটে হয়ে যাবে! এটাই কি ভাল না যে আমরা প্রতিটা এপ এর ইউআরএল কনফিগারেশন সেই এপ ফোল্ডারের এর ভিতরেই রাখব!? তাহলে কোডগুলো আরো অর্গানাইজড এবং রিইউজএবল হবে!

একাজটি করা খুবই সোজা, প্রথমে এপ ফোল্ডারের ভিতর urls.py নামে একটা ফাইল তৈরি করুনঃ

তারপর সেটা টেক্সট এডিটরে ওপেন করুন, এবং নিচের কোডগুলো লিখুনঃ

from django.conf.urls import url
from myapp.views import index
urlpatterns = [
url(r'^$', index),
]
  • প্রথমে আমরা url ফাংশনটি ইম্পোর্ট করেছি।

  • তারপর আমাদের ভিউ ফাইল থেকে index() ভিউ ফাংশন ইম্পোর্ট করেছি।

  • তারপর urlpatterns নামের একটা লিস্টে url ফাংশনটি কল করেছি, যার প্রথম প্যারামিটার হিসেবে আছে r’^$’ রেগুলার এক্সপ্রেশন, যেটা আসলে ফাকা স্ট্রিং এর সাথে ম্যাচ করবে (অর্থাৎ ইউআরএল এ কোন স্ট্রিং বা ভ্যালু থাকলে সেটা ম্যাচ করবেনা)

এখন myproject প্রোজেক্ট ফোল্ডারে থাকা urls.py ফাইল ওপেন করুন, সেখানে এরকম কোড থাকবেঃ

# উপরের কমেন্টগুলো বাদ দেয়া হয়েছে
from django.conf.urls import url
from django.contrib import admin
from myapp.views import index
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^myview/', index),
]

এটাকে মডিফাই করে এরকম করুনঃ

from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^myview/', include('myapp.urls'),
]
  • প্রথম লাইনে আমরা url এর সাথে include নামে একটা ফাংশন ইম্পোর্ট করেছি।

  • myapp.views থেকে যে index() ভিউ ইম্পোর্ট করা ছিল সেটা রিমোভ করেছি, সেটা এখানে আর দরকার নেই।

  • urlpatterns লিস্টের দ্বিতীয় আইটেমটিতে url ফাংশনে আমরা include(‘myapp.urls’) দিয়ে এটা বুঝিয়েছি যে যখনই কোনো রিকুয়েস্টকৃত ইউআরএল এর প্রথম অংশ r’^myview/’ এর সাথে ম্যাচ করবে তখন সে ইউআরএল এর বাকি অংশ ম্যাচ করার জন্য ‘myapp.urls’ ফাইলটা এখানে ইনক্লুড করে নিবে!

বিষয়টা একটু কঠিন হয়ে গেল!? আবার বলি, ধরুন আমরা ব্রাউজারে http://127.0.0.1:8000/myview/ লিখে এন্টার চাপলাম!

  • ব্রাউজার থেকে সার্ভারে রিকুয়েস্ট আসল, জ্যাঙ্গো উক্ত ইউআরএল টি myproject ফোল্ডারের urls.py তে থাকা urlpatterns লিস্টের ইউআরএল গুলোর সাথে মিলিয়ে দেখলো কোনটা মিলে!,

  • দ্বিতীয় প্যাটার্নটা উক্ত ইউআরএল এর প্রথম অংশ myview/ এর সাথে মিলল,

  • জ্যাঙ্গো এখন উক্ত ইউআরএল এর myview/ এর পরের অংশ মিলানোর জন্য myapp.urls এ থাকা urlpatterns লিস্টের সাথে ম্যাচ করা শুরু করল!,

  • যেহেতু myview/ এর পরের অংশ ফাঁকা বা সেখানে যেহেতু কিছুই নেই তাই সেটা r'^$' রেজেক্স এর সাথে ম্যাচ করল এবং তার সাথে থাকা index ভিউ কল হল।

  • অতঃপর ভিউ তার কাজ শেষে রেসপন্স পাঠিয়ে দিল!

মনে রাখবেনঃ জ্যাঙ্গো ইউআরএল ম্যাচ করে ডোমেইন নেম বাদ দিয়েঃ http://127.0.0.1:8000/myview/ এর ক্ষেত্রে শুধু myview/ টুকু ম্যাচ করা হবে http://127.0.0.1:8000/ অংশটা বাদ দেয়া হবে। রিকুয়েস্ট করা যেকোন ইউআরএল এর শেষে যদি স্ল্যাশ ‘/’ না থাকে তাহলে জ্যাঙ্গো অটোমেটিক সেখানে একটা স্ল্যাশ যুক্ত করে দেয়, তাই http://127.0.0.1:8000/myview এ রিকুয়েস্ট করলেও সেটা http://127.0.0.1:8000/myview/ হিসেবে দেখা হবে।