【问题标题】:How display only the urls in my browsable Web API, which the user has permission?如何仅显示用户有权访问的可浏览 Web API 中的 url?
【发布时间】:2015-12-18 13:45:16
【问题描述】:

我正在使用 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,但没有发生任何事情所有网址都已加载。

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

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

【问题讨论】:

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


    【解决方案1】:

    已修复。我覆盖了 django-rest-framework 的 DefaultRouter 类。 现在,如果用户没有列出对象的权限,则不会出现 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-08
      • 2022-01-13
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      • 2021-01-14
      相关资源
      最近更新 更多