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)
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
オブジェクトの詳細なリストを返します。
Django拡張機能には、manage.pyコマンドとしてこれを行うユーティリティが用意されています。
pip install Django-extensions
次に、Django_extensions
をsettings.py
のINSTALLED_APPSに追加します。次に、コンソールから次のように入力します
python manage.py show_urls
「私も」という回答を追加するリスクがあるため、プロジェクト内のすべての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>
凝ったものにしたい場合は、ビューに渡す変数を受け取る正規表現の入力ボックスを使用してリストをレンダリングできます(ここでも、プロダクションページではなく開発者ツールとして)。
この質問は少し古いですが、同じ問題に遭遇し、自分の解決策について話し合うと思いました。与えられたDjangoプロジェクトは明らかにそのすべてのURLを知る手段を必要とし、いくつかのことを行うことができる必要があります:
Djangoは主にRegexURLResolver
と呼ばれるオブジェクトを通じてこれを実現します。
次の方法で、これらのオブジェクトの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。
この機能をすべての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',
..
]
これで準備は完了です。
登録済みURLの完全なリストを取得する最も簡単な方法は、 contrib.admindocs をインストールしてから、[ビュー]セクションを確認することです。設定が非常に簡単で、すべてのテンプレートタグやモデルなどについて完全に参照可能なドキュメントを提供します。
DEBUGモードに示されているように評価された、または評価されていないURLを探していますか?評価された場合、Django.contrib.sitemapsが役立ちます。それ以外の場合は、Djangoのコードを使用したリバースエンジニアリングが必要になる場合があります。
ここで他の回答を試したところ、次のエラーが発生しました。
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)
_