将 Django urlpatterns 转换为字典
Posted
技术标签:
【中文标题】将 Django urlpatterns 转换为字典【英文标题】:Convert Django urlpatterns to dictionary 【发布时间】:2015-12-31 19:52:22 【问题描述】:我正在开发一个新的 Django 项目并使用 Django REST 框架构建一个 API。我正在尝试启用一个仅在DEBUG=True
时可访问的视图,它将序列化当前的 urlpatterns 并将它们作为 JSON 发送回来,以便前端开发人员可以使用它。
我正在寻找一种干净的方式来做到这一点。我可以遍历每个模式,但是一个模式可能有无限数量的子模式,所以我需要一些可以处理它的方法。
有什么内置的吗?除了暴力破解URL之外还有什么办法吗?我可以从头开始编写,但必须有更好的方法,因为 Django 404 页面包含此信息。我也会深入研究该源代码。
注意:复杂性和安全性不是问题,因为整个视图只有在系统位于DEBUG
时才可用。
我正在寻找的结果是这样的:
"^admin/": [
"^$ [name='index']",
"^admin/ ^login/$ [name='login']",
"^admin/ ^logout/$ [name='logout']",
...
],
"^auth/": [ ... ]
.
.
.
【问题讨论】:
Django admin docs 已经做了非常相似的事情。看看吧! 谢谢!绝对是一个更完整的选择(请参阅我的答案),但正在寻找一种不需要向其他区域添加更多代码的方法。将来会考虑这个! 【参考方案1】:经过一番挖掘,dir()
和 pdb
,我想出了一个解决方案。它使用递归策略搜索 URLS,直到找到 RegexURLPattern,并在那里终止。这适用于我的 URL 设置,但我不确定它对于复杂的 url 配置有多强大。仍然有兴趣听到其他想法!
def recursively_build__url_dict(d, urlpatterns):
for i in urlpatterns:
if isinstance(i, RegexURLResolver):
d[str(i.__dict__['_regex'])] =
recursively_build__url_dict(
d[str(i.__dict__['_regex'])], i.url_patterns
)
elif isinstance(i, RegexURLPattern):
d[str(i.regex.pattern)] = i.callback.__name__
编辑:我已经把它变成了gist
【讨论】:
以上是关于将 Django urlpatterns 转换为字典的主要内容,如果未能解决你的问题,请参考以下文章