将 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 转换为字典的主要内容,如果未能解决你的问题,请参考以下文章

AJAX 路由到 Django URL(使用 Django 2.0“路径”urlpatterns)

C#文件转换为字节流及字节流转换为文件

Django,urlpatterns中的名称参数

JS中,把一个数字转换为字串

Django:用户名的urlpattern?

django创建通用urlpatterns