我怎么能看到当前的urlpatterns“反向”正在寻找?
我在一个视图中调用了逆向,我认为这个论证应该成立,但实际上并不成立。有什么办法能让我知道为什么我的图案没有?
我怎么能看到当前的urlpatterns“反向”正在寻找?
我在一个视图中调用了逆向,我认为这个论证应该成立,但实际上并不成立。有什么办法能让我知道为什么我的图案没有?
当前回答
如果你想要一个项目中所有url的列表,首先你需要安装django-extensions
您可以使用命令简单地安装。
pip install django-extensions
有关包goto django-extensions的更多信息
之后,在settings.py文件中的INSTALLED_APPS中添加django_extensions,如下所示:
INSTALLED_APPS = (
...
'django_extensions',
...
)
urls . py的例子:
from django.urls import path, include
from . import views
from . import health_views
urlpatterns = [
path('get_url_info', views.get_url_func),
path('health', health_views.service_health_check),
path('service-session/status', views.service_session_status)
]
然后,在终端上运行任意命令
python manage.py show_urls
or
./manage.py show_urls
基于config urls.py的输出示例:
/get_url_info django_app.views.get_url_func
/health django_app.health_views.service_health_check
/service-session/status django_app.views.service_session_status
有关更多信息,您可以查看文档。
其他回答
你可以创建一个动态导入来收集项目中每个应用程序的所有URL模式,简单的方法如下:
def get_url_patterns():
import importlib
from django.apps import apps
list_of_all_url_patterns = list()
for name, app in apps.app_configs.items():
# you have a directory structure where you should be able to build the correct path
# my example shows that apps.[app_name].urls is where to look
mod_to_import = f'apps.{name}.urls'
try:
urls = getattr(importlib.import_module(mod_to_import), "urlpatterns")
list_of_all_url_patterns.extend(urls)
except ImportError as ex:
# is an app without urls
pass
return list_of_all_url_patterns
List_of_all_url_patterns = get_url_patterns()
我最近使用类似的方法创建了一个模板标记来显示活动导航链接。
这里有一个快速而肮脏的黑客,只需获得你需要的信息,而不需要修改任何设置。
$ pip install django-extensions
$ python manage.py shell -c 'from django.core.management import call_command; from django_extensions.management.commands.show_urls import Command; call_command(Command())'
这是小猪在逃避@robert的回答。虽然是正确的,但我不想让django扩展成为依赖项,哪怕只是一秒钟。
Django >= 2.0解决方案
我测试了这篇文章中的其他答案,它们要么不能与Django 2一起工作。X,不完整或太复杂。因此,以下是我的看法:
from django.conf import settings
from django.urls import URLPattern, URLResolver
urlconf = __import__(settings.ROOT_URLCONF, {}, {}, [''])
def list_urls(lis, acc=None):
if acc is None:
acc = []
if not lis:
return
l = lis[0]
if isinstance(l, URLPattern):
yield acc + [str(l.pattern)]
elif isinstance(l, URLResolver):
yield from list_urls(l.url_patterns, acc + [str(l.pattern)])
yield from list_urls(lis[1:], acc)
for p in list_urls(urlconf.urlpatterns):
print(''.join(p))
该代码打印所有url,不像其他解决方案,它将打印完整的路径,而不仅仅是最后一个节点。例如:
admin/
admin/login/
admin/logout/
admin/password_change/
admin/password_change/done/
admin/jsi18n/
admin/r/<int:content_type_id>/<path:object_id>/
admin/auth/group/
admin/auth/group/add/
admin/auth/group/autocomplete/
admin/auth/group/<path:object_id>/history/
admin/auth/group/<path:object_id>/delete/
admin/auth/group/<path:object_id>/change/
admin/auth/group/<path:object_id>/
admin/auth/user/<id>/password/
admin/auth/user/
... etc, etc
如果你想要一个项目中所有url的列表,首先你需要安装django-extensions
您可以使用命令简单地安装。
pip install django-extensions
有关包goto django-extensions的更多信息
之后,在settings.py文件中的INSTALLED_APPS中添加django_extensions,如下所示:
INSTALLED_APPS = (
...
'django_extensions',
...
)
urls . py的例子:
from django.urls import path, include
from . import views
from . import health_views
urlpatterns = [
path('get_url_info', views.get_url_func),
path('health', health_views.service_health_check),
path('service-session/status', views.service_session_status)
]
然后,在终端上运行任意命令
python manage.py show_urls
or
./manage.py show_urls
基于config urls.py的输出示例:
/get_url_info django_app.views.get_url_func
/health django_app.health_views.service_health_check
/service-session/status django_app.views.service_session_status
有关更多信息,您可以查看文档。
在Django 3.0中,这很简单:
from django.urls import get_resolver
print(get_resolver().url_patterns)
指纹: < urltern " >, < urltern '/测试"[另一个名称]>