पूर्ण Django url कॉन्फ़िगरेशन निर्धारित करें


82

वहाँ पूरा django url कॉन्फ़िगरेशन प्राप्त करने का एक तरीका है ?

उदाहरण के लिए, Django के डिबगिंग 404 पृष्ठ में url कॉन्फ़िगरेशन शामिल नहीं है, इसलिए यह पूर्ण कॉन्फ़िगरेशन नहीं है।


उत्तर : अलसदायर के लिए धन्यवाद, यहाँ एक उदाहरण स्क्रिप्ट है:

import urls

def show_urls(urllist, depth=0):
    for entry in urllist:
        print("  " * depth, entry.regex.pattern)
        if hasattr(entry, 'url_patterns'):
            show_urls(entry.url_patterns, depth + 1)

show_urls(urls.urlpatterns)

2
बहुत उपयोगी स्क्रिप्ट, धन्यवाद
रिचवैल

जवाबों:


49

Django पायथन है, इसलिए आत्मनिरीक्षण आपका मित्र है।

खोल में, आयात करें urls। के माध्यम से पाशन करके urls.urlpatterns, और संभव के रूप में शामिल url कॉन्फ़िगरेशन की कई परतों के माध्यम से ड्रिलिंग करके , आप पूर्ण url कॉन्फ़िगरेशन का निर्माण कर सकते हैं।

import urls
urls.urlpatterns

सूची urls.urlpatternsमें RegexURLPatternऔर RegexURLResolverवस्तुएं हैं।

एक RegexURLPatternवस्तु के लिए pआप के साथ नियमित अभिव्यक्ति प्रदर्शित कर सकते हैं

p.regex.pattern

किसी RegexURLResolverऑब्जेक्ट के लिए q, जिसमें शामिल url कॉन्फ़िगरेशन का प्रतिनिधित्व करता है, आप नियमित अभिव्यक्ति के पहले भाग को प्रदर्शित कर सकते हैं

q.regex.pattern

फिर उपयोग करें

q.url_patterns

जो वस्तुओं RegexURLResolverऔर RegexURLPatternवस्तुओं की एक और सूची लौटाएगा ।


3
अच्छा विचार! मैंने यहां एक सरल स्क्रिप्ट बनाई: code.activestate.com/recipes/576974
माइकल

यह एक सुंदर समारोह है। मैंने एक लिखने का प्रयास करना शुरू किया, लेकिन इसमें ऑब्जेक्ट प्रकारों की जाँच करना शामिल था कि क्या वे हैं RegexURLPatternया नहीं RegexURLResolver। का उपयोग करना has_attrबेहतर विचार है। आपको स्टैक ओवरफ्लो पर यहां अपना जवाब देना चाहिए। मैं इसे बढ़ाऊंगा।
अलास्देयर

यह सेटिंग्स फ़ाइल के माध्यम से चक्रीय आयात के मुद्दों का इतना कारण बनता है !!
NoobEditor

67

Django एक्सटेंशन इसे एक प्रबंधित करें कमांड के रूप में करने के लिए एक उपयोगिता प्रदान करता है।

pip install django-extensions

इसके बाद django_extensionsअपने INSTALLED_APPS में जोड़ें settings.py। फिर कंसोल से बस निम्नलिखित टाइप करें

python manage.py show_urls

2
हैंडी! मुझे नहीं लगता कि मैंने कभी यह खोज की होगी। धन्यवाद!
टिम रुडिक

6

"मुझे भी" उत्तर जोड़ने के जोखिम में, मैं ऊपर प्रस्तुत स्क्रिप्ट का एक संशोधित संस्करण पोस्ट कर रहा हूं, जो आपको परियोजना के सभी URL को देखने के लिए सूचीबद्ध करता है, कुछ हद तक पूर्वनिर्धारित और क्रमबद्ध रूप से और वर्णनात्मक रूप से जिन्हें वे कहते हैं। उत्पादन पृष्ठ की तुलना में अधिक डेवलपर टूल।

def all_urls_view(request):
    from your_site.urls import urlpatterns #this import should be inside the function to avoid an import loop
    nice_urls = get_urls(urlpatterns) #build the list of urls recursively and then sort it alphabetically
    return render(request, "yourapp/links.html", {"links":nice_urls})

def get_urls(raw_urls, nice_urls=[], urlbase=''):
    '''Recursively builds a list of all the urls in the current project and the name of their associated view'''
    from operator import itemgetter
    for entry in raw_urls:
        fullurl = (urlbase + entry.regex.pattern).replace('^','')
        if entry.callback: #if it points to a view
            viewname = entry.callback.func_name
            nice_urls.append({"pattern": fullurl, 
                  "location": viewname})
        else: #if it points to another urlconf, recur!
            get_urls(entry.url_patterns, nice_urls, fullurl)
    nice_urls = sorted(nice_urls, key=itemgetter('pattern')) #sort alphabetically
    return nice_urls

और टेम्पलेट:

<ul>
{% for link in links %}
<li>
{{link.pattern}}   -----   {{link.location}}
</li>
{% endfor%}
</ul>

यदि आप वास्तविक कल्पना प्राप्त करना चाहते हैं, तो आप किसी भी रीगेक्स के लिए सूची को इनपुट बॉक्स के साथ प्रस्तुत कर सकते हैं जो दृश्य में पास करने के लिए चर लेते हैं (फिर से उत्पादन पृष्ठ के बजाय एक डेवलपर उपकरण के रूप में)।


4

यह सवाल थोड़ा पुराना है, लेकिन मैं उसी समस्या में भाग गया और मैंने सोचा कि मैं अपने समाधान पर चर्चा करूंगा। किसी दिए गए Django प्रोजेक्ट को स्पष्ट रूप से अपने सभी URL के बारे में जानने का एक साधन चाहिए और कुछ चीजें करने में सक्षम होना चाहिए:

  1. एक यूआरएल से नक्शा -> देखें
  2. एक नामित url से मानचित्र -> url (तब 1 का उपयोग दृश्य प्राप्त करने के लिए किया जाता है)
  3. दृश्य नाम से नक्शा -> url (तब 1 का उपयोग दृश्य प्राप्त करने के लिए किया जाता है)

Django ज्यादातर एक नामक एक वस्तु के माध्यम से यह पूरा करता है RegexURLResolver

  1. RegexURLResolver.resolve (एक url से मानचित्र -> दृश्य)
  2. RegexURLResolver.reverse

आप इन वस्तुओं में से किसी एक पर अपना हाथ रख सकते हैं:

from my_proj import urls
from django.core.urlresolvers import get_resolver
resolver = get_resolver(urls)

उसके बाद, आप निम्न तरीके से अपने यूआरएल को प्रिंट कर सकते हैं:

for view, regexes in resolver.reverse_dict.iteritems():
    print "%s: %s" % (view, regexes)

यह कहा, Alasdair का समाधान पूरी तरह से ठीक है और इसके कुछ फायदे हैं, क्योंकि यह इस विधि की तुलना में अधिक अच्छी तरह से कुछ प्रिंट करता है। लेकिन किसी RegexURLResolverवस्तु पर अपने हाथों के बारे में जानना और उसके बारे में जानना कुछ अच्छा है, खासकर यदि आप Django के इंटर्नल में रुचि रखते हैं।


2

मैंने एक पैकेज (django-showurls) जमा किया है जो इस कार्यक्षमता को किसी भी Django परियोजना में जोड़ता है, यह एक सरल नई प्रबंधन कमांड है जो प्रबंधन के साथ अच्छी तरह से एकीकृत है:

$ python manage.py showurls
^admin/
  ^$
    ^login/$
    ^logout/$
.. etc ..

आप इसे पाइप के माध्यम से स्थापित कर सकते हैं:

pip install django-showurls

और फिर इसे अपने Django प्रोजेक्ट सेटिंग में अपने इंस्टॉल किए गए ऐप्स में जोड़ें:

INSTALLED_APPS = [
    ..
    'django_showurls',
    ..
]

और आप जाने के लिए तैयार हैं।

अधिक जानकारी यहाँ - https://github.com/Niklas9/django-showurls


अच्छा आपका धन्यवाद। यह उपयोगी हो सकता है यदि, प्रत्येक ट्री लाइन के बगल में, नियम को परिभाषित करने वाले एप्लिकेशन का नाम था (या ऐप का पता लगाने के लिए कुछ इसी तरह)।
वेदरन Mayego

ध्यान दें कि Django एक्सटेंशन्स में एक show_urlsकमांड भी शामिल है - django-extensions.readthedocs.io/en/latest/…
टेलर

1

पंजीकृत URL की पूरी सूची प्राप्त करने का सबसे आसान तरीका contrib.admindocs स्थापित करना है, फिर "दृश्य" अनुभाग जांचें। सेट करना बहुत आसान है, और आपको अपने सभी टेम्प्लेट टैग, मॉडल आदि पर पूरी तरह से ब्राउज़ करने योग्य डॉक्स भी देता है।


0

क्या आप मूल्यांकन का मूल्यांकन कर रहे हैं या मूल्यांकन नहीं किया है जैसा कि DEBUG मोड में दिखाया गया है? मूल्यांकन के लिए, django.contrib.sitemaps आपकी सहायता कर सकता है, अन्यथा इसमें Django के कोड के साथ कुछ रिवर्स इंजीनियरिंग शामिल हो सकती है।


0

जब मैंने यहाँ अन्य उत्तरों की कोशिश की, तो मुझे यह त्रुटि मिली:

django.core.exception.AppRegistryNotReady: ऐप्स अभी तक लोड नहीं हुए हैं।

ऐसा लगता है कि समस्या django.contrib.admin.autodiscover()मेरे उपयोग से आती है urls.py, इसलिए मैं या तो टिप्पणी कर सकता हूं कि URL के डंप करने से पहले Django को ठीक से लोड कर सकता हूं। बेशक अगर मैं मानचित्रण में व्यवस्थापक URL देखना चाहता हूं, तो मैं उन्हें टिप्पणी नहीं कर सकता।

जिस तरह से मैं एक कस्टम प्रबंधन कमांड बनाने के लिए पाया गया था वह उरोजों को डंप करता है।

# install this file in mysite/myapp/management/commands/urldump.py
from django.core.management.base import BaseCommand

from kive import urls


class Command(BaseCommand):
    help = "Dumps all URL's."

    def handle(self, *args, **options):
        self.show_urls(urls.urlpatterns)

    def show_urls(self, urllist, depth=0):
        for entry in urllist:
            print ' '.join(("  " * depth, entry.regex.pattern,
                            entry.callback and entry.callback.__module__ or '',
                            entry.callback and entry.callback.func_name or ''))
            if hasattr(entry, 'url_patterns'):
                self.show_urls(entry.url_patterns, depth + 1)

-3

यदि आप Django को डिबग मोड ( DEBUG = Trueअपनी सेटिंग्स में) में चला रहे हैं और फिर एक गैर-मौजूद URL टाइप करें तो आपको पूर्ण URL कॉन्फ़िगरेशन को सूचीबद्ध करने में एक त्रुटि पृष्ठ मिलेगा।


जैसा कि मैंने उल्लेख किया है, यह त्रुटि पृष्ठ पूर्ण कॉन्फ़िगरेशन नहीं दिखाता है क्योंकि इसमें शामिल url कॉन्फ़िगरेशन के बारे में जानकारी शामिल नहीं है।
माइकल

मुझे ठीक-ठीक समझ में आया कि आपके पास url कॉन्फ़िगरेशन के बारे में क्या है, लेकिन दोषपूर्ण मेमोरी से उत्तर दिया गया क्योंकि मेरे पास परीक्षण स्थल तक तत्काल पहुंच नहीं थी। मैं शपथ लेता हूं कि मैंने URL त्रुटि पृष्ठ को शीर्ष स्तर url और सम्मिलित url के बीच एक स्थान रखा है, लेकिन अब यह नहीं देखता। तो जवाब है नहीं, पूर्ण कॉन्फ़िगरेशन को देखने का कोई तरीका नहीं है।
वैन आंधी

त्रुटि पृष्ठ केवल प्रासंगिक शामिल url कॉन्फ़िगरेशन दिखाता है। ईजी 404 पेज के लिए एप /news/bad_url/से शामिल यूआरएल प्रदर्शित होंगे news, लेकिन sportएप से नहीं ।
अलास्देयर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.