如何仅显示用户有权访问的可浏览网站 API 中的网址?

How display only the urls in my browsable Web API, which the user has permission?

我正在使用 Python 3.4Django 1.8.4DjangoRestFramework 3.2.2

默认情况下,django rest 框架显示所有可用的 url,如果此人试图访问任何没有权限的 url,它会显示不允许的错误

"detail": "You do not have permission to perform this action."

从我在class DefaultRouter中看到的,它只加载了一次,当我上服务器时,

我注意到在 rest_framework/routers.py 的 283 行,有一个硬编码字段。

class APIRoot (views.APIView):
            _ignore_model_permissions = True

我已更改为 False,但什么也没发生 所有 url 都已加载。

我试图了解 Custom Router 的工作原理,但无法解决我的问题。

任何人都知道是否有任何方法可以在我的可浏览网站 API 中仅显示 url,用户有权限?

已修复。我覆盖了 django-rest-framework 的 DefaultRouter class。 现在,如果用户没有列出对象的权限,url 不会出现。

class UrlRouter(DefaultRouter):

    def get_api_root_view(self):
        """
        Return a view to use as the API root.
        """
        api_root_dict = OrderedDict()
        list_name = self.routes[0].name
        for prefix, viewset, basename in self.registry:
            api_root_dict[prefix] = list_name.format(basename=basename)

        class APIRoot(views.APIView):
            _ignore_model_permissions = True

            def get(self, request, *args, **kwargs):
                ret = OrderedDict()
                namespace = request.resolver_match.namespace
                for key, url_name in api_root_dict.items():
                    if namespace:
                        if request.user.has_perm(key.split('-')[0]+'_list'):
                            url_name = namespace + ':' + url_name
                    try:
                        from django.conf.urls import url
                        ret[key] = reverse(
                            url_name,
                            args=args,
                            kwargs=kwargs,
                            request=request,
                            format=kwargs.get('format', None)
                        )
                    except NoReverseMatch:
                        # Don't bail out if eg. no list routes exist, only detail routes.
                        continue
                return Response(ret)
        return APIRoot.as_view()