python django 中是否有类似于“rake 路线”的东西?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2092608/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 23:45:43  来源:igfitidea点击:

Is there something similar to 'rake routes' in django?

pythonruby-on-railsdjangoroutingdjango-urls

提问by miku

In rails, on can show the active routes with rake (http://guides.rubyonrails.org/routing.html):

在 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"}

Is there a similar tool/command for django showing the e.g. the URL pattern, the name of the pattern (if any) and the associated function in the views?

是否有类似的 django 工具/命令显示例如 URL 模式、模式名称(如果有)以及视图中的相关功能?

回答by miku

An experiment ...

一个实验 ...

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

Now, if one runs python urls.py...

现在,如果有人跑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

回答by Don Kirkby

When I tried miku's answer, I got this error:

当我尝试miku's answer 时,出现此错误:

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

django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。

It looks like the problem comes from using django.contrib.admin.autodiscover()in my urls.py, so I can either comment that out, or load Django properly before dumping the URL's. Of course if I want to see the admin URL's in the mapping, I can't comment them out.

看起来问题来自django.contrib.admin.autodiscover()在 my 中使用urls.py,因此我可以将其注释掉,或者在转储 URL 之前正确加载 Django。当然,如果我想在映射中看到管理 URL,我不能将它们注释掉。

The way I found was to create a custom management commandthat dumps the urls.

我发现的方法是创建一个转储 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)

回答by muhuk

admindocshas a similar feature. But it doesn't display URL names.

admindocs也有类似的功能。但它不显示 URL 名称。