2016-07-21 10 views
1

Ich möchte die API-Stammverzeichnisliste basierend auf den aktuellen Benutzerberechtigungen personalisieren, sodass nicht alle Endpunkte für alle Benutzer auf der Ebene sichtbar sind.Erstellen einer benutzerdefinierten API-Stammliste basierend auf Berechtigungen

Bsp .:

router.register(r'users',views.UserViewSet, base_name='users') 
router.register(r'groups', views.GroupViewSet, base_name='groups') 
router.register(r'schedules', views.CallSchedulesViewSet, base_name='schedules') 
urlpatterns = [ 
    url(r'^', include(router.urls)), 
    ... 
] 

Für "Superuser" die Liste sein sollte:

  • Benutzer
  • Gruppen
  • Pläne

Aber für "normaluser" die Liste sollte nur lauten:

  • Pläne

Antwort

0

Die Routen während der Anwendung gestartet wird registriert sind. Dies geschieht nicht bei jedem Anruf. Was du willst, ist vielleicht nicht möglich.

Eine Sache, die Sie tun können, ist 404 error not found statt 403 unauthorized error/access dened für die URLs Benutzer zurückgeben haben keinen Zugriff. Vom Benutzer Standpunkt, der so gut wie Routen ist, gibt es nicht.

+0

Dank Arun. Was ich getan habe, ist eine Ansicht ohne Daten hinzugefügt, es tut im Grunde, was Sie oben erwähnen. urlpatterns = [url (r '^ $', ansichten.APIRoot.as_view()), url (r '', include (router.urls)),] – Slipstream

1

Ich habe dies mit dem folgenden Ansatz gelöst, vielleicht nicht die eleganteste, aber es dient als ein Beispiel.

urls.py

router = routers.DefaultRouter() 
router.register(r'users', views.UserViewSet, base_name='users') 
router.register(r'groups', views.GroupViewSet, base_name='groups') 
router.register(r'schedules', views.SchedulesViewSet, base_name='schedules') 

urlpatterns = [ 
    url(r'^$', views.APIRoot.as_view()), 
    url(r'', include(router.urls)), 
    ... 
] 

views.py

from rest_framework.views import APIView 
from rest_framework.response import Response 

class APIRoot(APIView): 
    """ 
    API Root ... 
    """ 
    def get(self, request): 
     data = { 
      "users": "http://localhost:8000/users/", 
      "groups": "http://localhost:8000/groups/", 
      "schedules": "http://localhost:8000/schedules/", 
     } 

     if not request.user.is_superuser: 
      data.pop("users") 
      data.pop("groups") 

     return Response(data)