将Django urlpatterns转换为字典

时间:2015-10-03 19:57:57

标签: django django-rest-framework django-urls

我正在开发一个新的Django项目,并使用Django REST Framework构建API。我正在尝试启用仅在DEBUG=True 时可以访问的视图,该视图将序列化当前的urlpatterns并将其作为JSON发回,以便前端开发人员可以使用它。

我正在寻找一种干净的方式来做到这一点。我可以迭代每个模式,但模式可能有无限数量的子模式,所以我需要一些方法来处理它。

这里有内置的东西吗?除了强制URL之外的任何方式?我可以从头开始编写,但由于Django 404页面包含此信息,因此必须有更好的方法。我也将深入研究这些源代码。

注意:复杂性和安全性不是问题,因为整个视图仅在系统位于DEBUG时才可用。

我正在寻找的结果是:

{
    "^admin/": [
                  "^$ [name='index']",
                  "^admin/ ^login/$ [name='login']",
                  "^admin/ ^logout/$ [name='logout']",
                  ...
               ],
    "^auth/": [ ... ]
    .
    .
    .
}

1 个答案:

答案 0 :(得分:1)

经过一番挖掘,dir()pdb后,我想出了一个解决方案。它使用递归策略搜索URL,直到找到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