web-dev-qa-db-ja.com

djangoの「レーキルート」に似たものはありますか?

Railsでは、onはrakeを使用してアクティブなルートを表示できます( http://guides.rubyonrails.org/routing.html ):

$ rake routes
          users GET  /users          {:controller=>"users", :action=>"index"}
formatted_users GET  /users.:format  {:controller=>"users", :action=>"index"}
                POST /users          {:controller=>"users", :action=>"create"}
                POST /users.:format  {:controller=>"users", :action=>"create"}

Djangoに同様のツール/コマンドがありますか?たとえば、URLパターン、パターンの名前(存在する場合)、および関連する関数がビューに表示されますか?

44
miku

見つけました https://github.com/Django-extensions/Django-extensions

$ ./manage.py show_urls
68
miku

実験 ...

# appended to root urls.py

if __name__ == '__main__':

    from Django.core.urlresolvers import RegexURLPattern, RegexURLResolver
    from Django.utils.termcolors import colorize
    import os, sys

    sys.path.append(os.path.abspath('..'))
    os.environ['Django_SETTINGS_MODULE'] = 'ialtr.settings'

    def traverse(url_patterns, prefix=''):
        for p in url_patterns:
            if isinstance(p, RegexURLPattern):
                composed = '%s%s' % (prefix, p.regex.pattern)
                composed = composed.replace('/^', '/')
                print colorize('\t%s' % (composed), fg='green'), '==> ',
                try:
                    sys.stdout.write(colorize('%s.' % p.callback.__module__,
                        fg='yellow'))
                    print p.callback.func_name
                except:
                    print p.callback.__class__.__name__
            if isinstance(p, RegexURLResolver):
                traverse(p.url_patterns, prefix=p.regex.pattern)

    traverse(urlpatterns)

さて、実行するとpython urls.py.。

$ python urls.py
    ^users/activate/complete/$ ==> Django.views.generic.simple.direct_to_template
    ^users/activate/(?P<activation_key>\w+)/$ ==> registration.views.activate
    ^users/register/$ ==> registration.views.register
    ^users/register/complete/$ ==> Django.views.generic.simple.direct_to_template
    ^users/register/closed/$ ==> Django.views.generic.simple.direct_to_template
    ^login/$ ==> Django.contrib.auth.views.MethodDecoratorAdaptor
    ^logout/$ ==> Django.contrib.auth.views.logout
    ^password/change/$ ==> Django.contrib.auth.views.MethodDecoratorAdaptor
    ^password/change/done/$ ==> Django.contrib.auth.views.password_change_done
    ^password/reset/$ ==> Django.contrib.auth.views.MethodDecoratorAdaptor
    ^password/reset/confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$ ==> Django.contrib.auth.views.password_reset_confirm
    ^password/reset/complete/$ ==> Django.contrib.auth.views.password_reset_complete
    ^password/reset/done/$ ==> Django.contrib.auth.views.password_reset_done
    ^ialt/applications/$ ==> ialt.views.applications
    ^static/(?P<path>.*)$ ==> Django.views.static.serve
    ^$ ==> Django.views.generic.simple.direct_to_template
    ^about/ ==> Django.views.generic.simple.direct_to_template
4
miku

ミクの答え を試したところ、次のエラーが発生しました:

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)
_
3
Don Kirkby

admindocs 同様の機能があります。ただし、URL名は表示されません。

1
muhuk