0

Я использую Python 3.4, Django 1.8.4 и DjangoRestFramework 3.2.2Как отображать только URL-адреса в моем просматриваемом веб-API, который у пользователя есть разрешение?

По умолчанию, фреймворк остального Джанго, отображает все доступные адреса, и если человек пытается получить доступ к любому URL, который не имеет разрешения, он выводит сообщение об ошибке, что не допускается

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

Из того, что я видел в class DefaultRouter, он загружается только один раз, когда я иду на сервер,

Я заметил, что в строке из rest_framework/routers.py есть жестко закодированное поле.

class APIRoot (views.APIView): 
            _ignore_model_permissions = True 

Я изменил Ложь и ничего не произошло все URLs загружены.

Я попытался понять, как работает Custom Router, но не решит мою проблему.

Кто-нибудь знает, есть ли способ показать только URL-адреса в моем просматриваемом веб-API, с которым у пользователя есть разрешение?

ответ

0

Исправлено. Я перезаписываю класс DefaultRouter django-rest-framework. Теперь, если у пользователя нет разрешения на перечисление объекта, 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()