完全なDjangoURL構成を決定する


82

完全なdjangoURL構成を取得する方法はありますか?

たとえば、Djangoのデバッグ404ページには、含まれているURL構成が表示されないため、これは完全な構成ではありません。


回答:Alasdairのおかげで、スクリプトの例を次に示します。

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

回答:


49

DjangoはPythonなので、内省はあなたの友達です。

シェルで、をインポートしurlsます。をループしurls.urlpatterns、含まれているURL構成のできるだけ多くのレイヤーをドリルダウンすることで、完全なURL構成を構築できます。

import urls
urls.urlpatterns

リストにurls.urlpatternsRegexURLPatternRegexURLResolverオブジェクトが含まれています。

以下のためRegexURLPatternのオブジェクトpあなたは、正規表現を表示することができます

p.regex.pattern

以下のためにRegexURLResolverオブジェクトq含まれるURLの設定を表し、あなたが正規表現の最初の部分を表示することができます

q.regex.pattern

次に、

q.url_patterns

これによりRegexURLResolverRegexURLPatternオブジェクトのリストがさらに返されます。


3
良いアイデア!ここで簡単なスクリプトを作成しました:code.activestate.com/recipes/576974
Michael

それはエレガントな機能です。私はそれを書き始めましたが、オブジェクトタイプをチェックしてそれらがRegexURLPatternまたはであるかどうかを確認する必要がありましたRegexURLResolver。使用することhas_attrははるかに良い考えです。ここStackOverflowで関数を答えてください。私はそれを賛成します。
Alasdair

これは、設定ファイルを介した循環インポートの問題の多くを引き起こします!!
noobEditor 2017

67

Django拡張機能は、manage.pyコマンドとしてこれを行うためのユーティリティを提供します。

pip install django-extensions

次にdjango_extensions、のINSTALLED_APPSに追加しますsettings.py。次に、コンソールから次のように入力します

python manage.py show_urls

2
ハンディ!私はこれを発見したことはないと思います。ありがとう!
ティムラディック2014年

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. URLからの地図->ビュー
  2. 名前付きURLからのマップ-> url(次に1を使用してビューを取得します)
  3. ビュー名からのマップ-> url(その後、ビューを取得するために1が使用されます)

Djangoは、主にRegexURLResolver。と呼ばれるオブジェクトを介してこれを実現します。

  1. RegexURLResolver.resolve(URLからのマップ->ビュー)
  2. RegexURLResolver.reverse

次の方法で、これらのオブジェクトの1つを手に入れることができます。

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の内部に興味がある場合は、オブジェクトについて知って手に入れることは知っておくと便利です。


2

この機能をDjangoプロジェクトに追加するパッケージ(django-showurls)を提出しました。これは、manage.pyとうまく統合されるシンプルな新しい管理コマンドです。

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

あなたはpipを通してそれをインストールすることができます:

pip install django-showurls

次に、それをDjangoプロジェクトsettings.pyファイルのインストール済みアプリに追加します。

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

そして、あなたは行く準備ができています。

詳細はこちら -https://github.com/Niklas9/django-showurls


いいね、ありがとう。各ツリーラインの横に、ルールを定義するアプリの名前(またはアプリを検出するための同様の方法)があると便利な場合があります。
VedranŠego

Djangoの拡張機能も含まれることに注意してくださいshow_urls-コマンドdjango-extensions.readthedocs.io/en/latest/...
テイラーEdmiston

1

登録されたURLの完全なリストを取得する最も簡単な方法は、contrib.admindocsをインストールしてから、[ビュー]セクションを確認することです。セットアップが非常に簡単で、すべてのテンプレートタグ、モデルなどについて完全に閲覧可能なドキュメントを提供します。


0

DEBUGモードで表示されるように評価された、または評価されていないURLを探していますか?評価については、django.contrib.sitemapsが役立ちます。そうでない場合は、Djangoのコードを使用したリバースエンジニアリングが必要になる可能性があります。


0

ここで他の答えを試したところ、次のエラーが発生しました。

django.core.exceptions.AppRegistryNotReady:アプリはまだ読み込まれていません。

問題はdjango.contrib.admin.autodiscover()私のurls.pyでの使用に起因しているようです。そのため、コメントアウトするか、URLをダンプする前にDjangoを適切にロードすることができます。もちろん、マッピングに管理URLを表示したい場合は、コメントアウトできません。

私が見つけた方法は、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構成に関する情報が含まれていないため、完全な構成は表示されません。
マイケル

INCLUDED url構成の意味を正確に理解しましたが、テストサイトにすぐにアクセスできなかったため、メモリの障害から回答しました。URLエラーページがトップレベルのURLと含まれているURLの間にスペースを入れているのを見たことがあると誓いますが、今はそうではありません。したがって、答えは「いいえ」です。完全な構成を確認する方法はありません。
ヴァンゲイル

エラーページには、関連する含まれているURL構成のみが表示されます。たとえば、の404ページに/news/bad_url/は、newsアプリからのURLは表示されますが、アプリからのURLは表示されませんsport
Alasdair
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.