web-dev-qa-db-ja.com

完全なDjango url設定を決定します

complete Django url設定を取得する方法はありますか?

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


Answer: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)
80
Michael

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

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

import urls
urls.urlpatterns

リスト urls.urlpatternsにはRegexURLPatternおよびRegexURLResolverオブジェクトが含まれます。

RegexURLPatternオブジェクトpの場合、次のようにして正規表現を表示できます

p.regex.pattern

含まれているURL設定を表すRegexURLResolverオブジェクトqの場合、正規表現の最初の部分を次のように表示できます

q.regex.pattern

次に使用します

q.url_patterns

RegexURLResolverおよびRegexURLPatternオブジェクトの詳細なリストを返します。

47
Alasdair

Django拡張機能には、manage.pyコマンドとしてこれを行うユーティリティが用意されています。

pip install Django-extensions

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

python manage.py show_urls
66
Alan Viars

「私も」という回答を追加するリスクがあるため、プロジェクト内のすべての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>

凝ったものにしたい場合は、ビューに渡す変数を受け取る正規表現の入力ボックスを使用してリストをレンダリングできます(ここでも、プロダクションページではなく開発者ツールとして)。

6
andy

この質問は少し古いですが、同じ問題に遭遇し、自分の解決策について話し合うと思いました。与えられた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 internals。

4
abhillman

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

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

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

pip install Django-showurls

そして、それをDjango project settings.pyファイルのインストール済みアプリに追加します:

INSTALLED_APPS = [
    ..
    'Django_showurls',
    ..
]

これで準備は完了です。

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

2
Niklas9

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

1
shacker

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

0
Thierry Lam

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

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

問題は、_urls.py_でDjango.contrib.admin.autodiscover()を使用することに起因するようです。そのため、コメント化するか、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)
_
0
Don Kirkby