> For the complete documentation index, see [llms.txt](https://django.howtocode.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://django.howtocode.dev/url_configuration_in_depth.md).

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

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

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

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

![](https://i.imgur.com/1dLQ0iE.png)

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

```
from django.conf.urls import url

from myapp.views import index

urlpatterns = [
    url(r'^$', index),
]
```

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

এখন `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` লিস্টের ইউআরএল গুলোর সাথে মিলিয়ে দেখলো কোনটা মিলে!,&#x20;
* দ্বিতীয় প্যাটার্নটা উক্ত ইউআরএল এর প্রথম অংশ `myview/` এর সাথে মিলল,&#x20;
* জ্যাঙ্গো এখন উক্ত ইউআরএল এর `myview/` এর পরের অংশ মিলানোর জন্য `myapp.urls` এ থাকা `urlpatterns` লিস্টের সাথে ম্যাচ করা শুরু করল!,&#x20;
* যেহেতু `myview/` এর পরের অংশ ফাঁকা বা সেখানে যেহেতু কিছুই নেই তাই সেটা `r'^$'`  রেজেক্স এর সাথে ম্যাচ করল এবং তার সাথে থাকা index ভিউ কল হল।&#x20;
* অতঃপর ভিউ তার কাজ শেষে রেসপন্স পাঠিয়ে দিল!

> **মনে রাখবেনঃ** জ্যাঙ্গো ইউআরএল ম্যাচ করে ডোমেইন নেম বাদ দিয়েঃ `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/` হিসেবে দেখা হবে।
