我怎么能看到当前的urlpatterns“反向”正在寻找?

我在一个视图中调用了逆向,我认为这个论证应该成立,但实际上并不成立。有什么办法能让我知道为什么我的图案没有?


当前回答

def get_resolved_urls(url_patterns):
    url_patterns_resolved = []
    for entry in url_patterns:
        if hasattr(entry, 'url_patterns'):
            url_patterns_resolved += get_resolved_urls(
                entry.url_patterns)
        else:
            url_patterns_resolved.append(entry)
    return url_patterns_resolved

在python中manage.py shell

import urls
get_resolved_urls(urls.urlpatterns)

其他回答

import subprocces

res = subprocess.run(
    'python manage.py show_urls',
    capture_output=True,
    shell=True,
)
url_list = [
    line.split('\t')[0]
    for line in res.stdout.decode().split('\n')
]

有一个activestate的配方

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.url_patterns)

如果你正在使用DRF,你可以通过从router.get_urls()(在你的Django应用的urls.py文件中)打印特定路由器的urlpatterns来打印所有的URL模式。

打开你的apps urls.py,并在文件底部添加打印语句,这样整个文件看起来就像这样:

import pprint

from django.urls import include, path
from rest_framework import routers

from . import views

router = routers.DefaultRouter()
router.register(r"users", views.UserViewSet, basename="User")
router.register(r"auth", views.AuthenticationView, basename="Auth")
router.register(r"dummy", views.DummyViewSet, basename="Dummy")
router.register("surveys", views.SurveyViewSet, basename="survey")

urlpatterns = [
    path("", include(router.urls)),
]

pprint.pprint(router.get_urls())

然后,这些图案会像这样打印出来:

[<URLPattern '^users/$' [name='User-list']>,
 <URLPattern '^users\.(?P<format>[a-z0-9]+)/?$' [name='User-list']>,
 <URLPattern '^users/admins/$' [name='User-admins']>,
 <URLPattern '^users/admins\.(?P<format>[a-z0-9]+)/?$' [name='User-admins']>,
 <URLPattern '^users/current/$' [name='User-current']>,
 <URLPattern '^users/current\.(?P<format>[a-z0-9]+)/?$' [name='User-current']>,
 <URLPattern '^users/(?P<pk>[^/.]+)/$' [name='User-detail']>,
 <URLPattern '^users/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$' [name='User-detail']>,
 <URLPattern '^auth/login/$' [name='Auth-login']>,
...
]

只要输入一个你知道不存在的url,服务器就会返回一个错误消息,其中包含一个url模式列表。

例如,如果你在http://localhost:8000/something上运行一个网站

输入

http://localhost:8000/something/blahNonsense,您的服务器将返回url搜索列表并在浏览器中显示它

Django >= 2.0列表解决方案

领养自@CesarCanassa

from django.conf import settings
from django.urls import URLPattern, URLResolver

URLCONF = __import__(settings.ROOT_URLCONF, {}, {}, [''])

def list_urls(patterns, path=None):
    """ recursive """
    if not path:
        path = []
    result = []
    for pattern in patterns:
        if isinstance(pattern, URLPattern):
            result.append(''.join(path) + str(pattern.pattern))
        elif isinstance(pattern, URLResolver):
            result += list_urls(pattern.url_patterns, path + [str(pattern.pattern)])
    return result