2009-12-01 33 views
71

有沒有辦法讓完成 django url配置?確定完整的Django url配置

例如,Django的調試404頁面沒有顯示包含的url configs,所以這不是完整的配置。


:感謝阿拉斯代爾,這裏是一個示例腳本:

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

非常有用的腳本,謝謝 – RichVel 2012-12-09 07:04:44

回答

44

Django是Python,所以內省是你的朋友。

在shell中,導入urls。通過循環遍歷urls.urlpatterns,並儘可能深入地包含儘可能多的包含url配置的層,您可以構建完整的url配置。

import urls 
urls.urlpatterns 

列表urls.urlpatterns包含RegexURLPatternRegexURLResolver對象。

對於RegexURLPattern對象p可以顯示與

p.regex.pattern 

正則表達式對於RegexURLResolver對象q,其表示包括URL配置,可以用

顯示正則表達式的第一部分
q.regex.pattern 

然後用

q.url_patterns 

這將返回另一個RegexURLResolverRegexURLPattern對象的列表。

+3

好主意!我在這裏做了一個簡單的腳本:http://code.activestate.com/recipes/576974/ – Michael 2009-12-03 18:20:45

+0

這是一個優雅的功能。我開始嘗試編寫一個,但它涉及檢查對象類型以查看它們是否是'RegexURLPattern'或'RegexURLResolver'。使用'has_attr'是一個更好的主意。你應該把你的函數放在Stack Overflow的回答裏。我會贊成它。 – Alasdair 2009-12-03 23:37:17

+0

這會通過設置文件導致很多循環導入問題! – NoobEditor 2017-04-05 09:56:08

-3

如果你在調試模式下運行的Django(有DEBUG = True在你的設置),然後輸入一個不存在的URL將會出現一個錯誤頁面,列出完整的URL配置。

+0

正如我提到的,這個錯誤頁面不顯示完整的配置,因爲它不包括有關*包括* URL配置的信息。 – Michael 2009-12-01 21:35:48

+0

我完全理解你對包含URL配置的含義,但是從錯誤的內存中回答,因爲我沒有立即訪問測試站點。我發誓我已經看到URL錯誤頁面在頂層url和包含的url之間放置一個空格,但現在看不到。所以答案是否定的,沒有辦法看到完整的配置。 – 2009-12-01 21:49:38

+0

錯誤頁面僅顯示_relevant_包含的url配置。例如。 '/ news/bad_url /'的404頁面將顯示來自'news'應用的包含url,但不會來自'sport'應用。 – Alasdair 2009-12-01 22:50:15

0

您是否正在尋找在DEBUG模式下顯示的評估或未評估的URL?對於評估,django.contrib.sitemaps可以幫助你,否則它可能涉及到一些使用Django代碼的逆向工程。

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> 

如果你想獲得真正看中的,你可以渲染與任何採取變量的正則表達式的輸入框列表傳遞給視圖(再次作爲開發人員工具而不是生產頁面)。

1

獲取完整註冊URL列表的最簡單方法是安裝contrib.admindocs,然後檢查「視圖」部分。很容易建立,也爲您提供了完全可瀏覽的文檔上所有的模板標籤,型號等

57

Django的擴展提供了一個工具來做到這一點作爲一個manage.py命令。

pip install django-extensions 

然後在settings.py添加django_extensions到您的INSTALLED_APPS。然後從控制檯只需鍵入以下

python manage.py show_urls 
+1

方便!我不認爲我會發現這一點。謝謝! – 2014-05-09 23:54:22

+0

太棒了!謝謝! – mawaldne 2015-06-10 15:27:46

+0

這是正確的答案 – abbood 2016-07-17 06:48:05

4

這個問題是有點老了,但我遇到了同樣的問題,我想我會討論我的解決方案。一個給定的Django項目顯然需要知道關於它的所有URL的手段,需要能夠做兩件事情:

  1. 從URL地圖 - >查看
  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) 

然後,你可以簡單地打印出你的URL方式如下:

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

也就是說,Alasdair的解決方案非常好,並且具有一些優勢,因爲它打印出比這種方法更好的東西。但對此有所瞭解,並讓你的手一RegexURLResolver對象是一些好聽的瞭解,特別是如果你有興趣在Django內部。

0

當我試圖在這裏其他的答案,我得到這個錯誤:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

它看起來像這個問題來自於我的urls.py使用django.contrib.admin.autodiscover(),所以我可以評論說出來,或者正確之前加載的Django轉儲網址。當然,如果我想看到管理的URL中的映射,我不能評論出來。

我發現的方式是創建一個custom management command轉儲網址。

# 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) 
2

我已經提交了一個包(Django的showurls),增加了這個功能,任何Django項目,這是一個簡單的新的管理命令與manage.py很好地結合:

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

您可以安裝它通過點:

pip install django-showurls 

然後將其添加到您的Django項目設置中安裝的應用程序。py文件:

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

而你準備好了。

更多資訊 - https://github.com/Niklas9/django-showurls

+0

不錯,謝謝。如果在每行樹旁邊有定義規則的應用程序的名稱(或者類似的檢測應用程序的方式),它可能會很有用。 – 2016-05-22 23:18:52

+0

請注意,Django擴展還包括一個'show_urls'命令 - http://django-extensions.readthedocs.io/en/latest/command_extensions.html – 2016-07-25 14:59:35