Django
URL रूटिंग
खोज…
कैसे Django एक अनुरोध संभालती है
Django आने वाले URL पथ को देखने के कार्य के लिए एक अनुरोध को संभालता है। अनुरोध करने वाले ग्राहक को प्रतिक्रिया वापस करने के लिए दृश्य फ़ंक्शन जिम्मेदार है। अलग-अलग URL आमतौर पर विभिन्न व्यू फ़ंक्शंस द्वारा नियंत्रित किए जाते हैं। किसी विशिष्ट दृश्य फ़ंक्शन के अनुरोध को रूट करने के लिए, Django आपके URL कॉन्फ़िगरेशन (या शॉर्ट के लिए URLconf) को देखता है। डिफ़ॉल्ट प्रोजेक्ट टेम्प्लेट <myproject>/urls.py
में URLconf को परिभाषित करता है।
आपका URLconf एक अजगर मॉड्यूल होना चाहिए जो urlpatterns
नामक एक विशेषता को परिभाषित करता है, जो django.conf.urls.url()
उदाहरणों की एक सूची है। प्रत्येक url()
उदाहरण को URL से मेल खाने के लिए एक नियमित अभिव्यक्ति (एक रेगेक्स) को न्यूनतम रूप से परिभाषित करना चाहिए, और एक लक्ष्य, जो या तो एक दृश्य फ़ंक्शन या एक अलग URLconf है। यदि URL पैटर्न किसी व्यू फ़ंक्शन को लक्षित करता है, तो बाद में पैटर्न को आसानी से संदर्भित करने के लिए इसे एक नाम देना एक अच्छा विचार है।
आइए एक बुनियादी उदाहरण देखें:
# In <myproject>/urls.py
from django.conf.urls import url
from myapp.views import home, about, blog_detail
urlpatterns = [
url(r'^$', home, name='home'),
url(r'^about/$', about, name='about'),
url(r'^blog/(?P<id>\d+)/$', blog_detail, name='blog-detail'),
]
यह URLconf तीन URL पैटर्न को परिभाषित करता है, सभी एक दृश्य को लक्षित करते हैं: home
, के about
और blog-detail
।
-
url(r'^$', home, name='home'),
रेगेक्स में एक स्टार्ट एंकर '^' होता है, जिसके तुरंत बाद एंकर '$' होता है। यह पैटर्न उन अनुरोधों से मेल खाएगा जहां URL पथ एक रिक्त स्ट्रिंग है, और उन्हें myapp.views
में परिभाषित home
दृश्य पर myapp.views
।
-
url(r'^about/$', about, name='about'),
इस रेगेक्स में एक स्टार्ट एंकर होता है, जिसके बाद शाब्दिक स्ट्रिंग के about/
और अंत एंकर होता है। यह URL /about/
से मेल खाएगा और इसे व्यू के about
बताएगा। चूंकि हर गैर-रिक्त URL एक /
शुरू होता है, Django आपके लिए पहली स्लैश की सुविधा में कटौती करता है।
-
url(r'^blog/(?P<id>\d+)/$', blog_detail, name='blog-detail'),
यह रेगीक्स थोड़ा अधिक जटिल है। यह पिछले पैटर्न की तरह स्टार्ट एंकर और शाब्दिक स्ट्रिंग blog/
को परिभाषित करता है। अगला भाग, (?P<id>\d+)
, एक कैप्चरिंग ग्रुप कहलाता है। एक कैप्चरिंग ग्रुप, जैसा कि इसके नाम से पता चलता है, स्ट्रिंग का एक हिस्सा कैप्चर करता है, और Django कैप्चर किए गए स्ट्रिंग को व्यू फ़ंक्शन के तर्क के रूप में पास करता है।
कैप्चरिंग ग्रुप का सिंटैक्स (?P<name>pattern)
। name
समूह के नाम को परिभाषित करता है, जो कि नाम के तर्क को पास करने के लिए Django का उपयोग करता है। पैटर्न परिभाषित करता है कि कौन से अक्षर समूह द्वारा मेल खाते हैं।
इस स्थिति में, नाम id
, इसलिए फ़ंक्शन blog_detail
को id
नाम के पैरामीटर को स्वीकार करना होगा। पैटर्न \d+
। \d
यह दर्शाता है कि पैटर्न केवल संख्या वर्णों से मेल खाता है। +
यह दर्शाता है कि पैटर्न को एक या अधिक वर्णों से मेल खाना चाहिए।
कुछ सामान्य पैटर्न:
पैटर्न | के लिए इस्तेमाल होता है | माचिस |
---|---|---|
\d+ | आईडी | एक या अधिक संख्यात्मक वर्ण |
[\w-]+ | काउंटर | एक या अधिक अल्फ़ान्यूमेरिक वर्ण, अंडरस्कोर या डैश |
[0-9]{4} | वर्ष (लंबा) | चार नंबर, नौ के माध्यम से शून्य |
[0-9]{2} | वर्ष (छोटा) महीना महीने का दिन | दो नंबर, नौ के माध्यम से शून्य |
[^/]+ | पथ खंड | एक स्लेश को छोड़कर कुछ भी |
blog-detail
पैटर्न में कैप्चरिंग समूह एक शाब्दिक /
और अंत एंकर द्वारा पीछा किया जाता है।
मान्य URL में शामिल हैं:
-
/blog/1/ # passes id='1'
-
/blog/42/ # passes id='42'
अमान्य URL उदाहरण के लिए हैं:
-
/blog/a/ # 'a' does not match '\d'
-
/blog// # no characters in the capturing group does not match '+'
Django प्रत्येक URL पैटर्न को उसी क्रम में संसाधित करता है जिस क्रम में वे urlpatterns
में परिभाषित किए urlpatterns
। यह महत्वपूर्ण है अगर कई पैटर्न एक ही URL से मेल खा सकते हैं। उदाहरण के लिए:
urlpatterns = [
url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
url(r'blog/overview/$', blog_overview, name='blog-overview'),
]
उपरोक्त URLconf में, दूसरा पैटर्न उपलब्ध नहीं है। पैटर्न URL /blog/overview/
मेल खाएगा, लेकिन blog_overview
दृश्य को कॉल करने के बजाय, URL पहले blog-detail
पैटर्न से मेल खाएगा और एक तर्क slug='overview'
साथ blog_detail
दृश्य को कॉल करेगा।
यह सुनिश्चित करने के लिए कि URL /blog/overview/
blog_overview
दृश्य में रूट किया गया है, पैटर्न को blog-detail
पैटर्न से ऊपर रखा जाना चाहिए:
urlpatterns = [
url(r'blog/overview/$', blog_overview, name='blog-overview'),
url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
]
पुन: प्रयोज्य एप्लिकेशन के लिए URL नामस्थान सेट करें (Django 1.9+)
app_name
विशेषता सेट करके URL नामस्थान का स्वचालित रूप से उपयोग करने के लिए अपने ऐप के URLconf को कॉन्फ़िगर करें:
# In <myapp>/urls.py
from django.conf.urls import url
from .views import overview
app_name = 'myapp'
urlpatterns = [
url(r'^$', overview, name='overview'),
]
जब यह रूट URLconf> में शामिल हो जाता है, तो यह एप्लिकेशन नामस्थान को 'myapp'
सेट कर देगा। आपके पुन: प्रयोज्य एप्लिकेशन के उपयोगकर्ता को आपके URL सहित किसी अन्य कॉन्फ़िगरेशन को करने की आवश्यकता नहीं है:
# In <myproject>/urls.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^myapp/', include('myapp.urls')),
]
आपका नाम पुन: प्रयोज्य एप्लिकेशन अब अनुप्रयोग नामस्थान का उपयोग करके URL को उलट सकता है:
>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'
रूट URLconf अभी भी namespace
पैरामीटर के साथ एक उदाहरण नामस्थान सेट कर सकता है:
# In <myproject>/urls.py
urlpatterns = [
url(r'^myapp/', include('myapp.urls', namespace='mynamespace')),
]
URL नाम को उलटने के लिए एप्लिकेशन नामस्थान और उदाहरण नामस्थान दोनों का उपयोग किया जा सकता है:
>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'
>>> reverse('mynamespace:overview')
'/myapp/overview/'
अगर यह स्पष्ट रूप से सेट नहीं है तो नाम नेमस्पेस एप्लिकेशन नेमस्पेस को डिफॉल्ट करता है।