2016-07-21 2 views
1

Мне нравится настраивать список api_root на основе текущих прав пользователя, чтобы не все конечные точки были видны всем пользователям уровня.Как создать собственный корневой список API на основе разрешений

Ex .:

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)), 
    ... 
] 

Для "суперпользователя" список должен быть:

  • пользователей
  • группы
  • графики

Но для "normaluser" список должен быть только:

  • графики

ответ

0

Маршруты регистрируются при запуске приложения. Это не происходит при каждом вызове. Так что вы хотите, возможно, не удастся.

Одна вещь, которую вы можете сделать, это вернуть 404 error not found вместо этого на 403 unauthorized error/access dened, так как пользователь URL не имеет доступа. С точки зрения пользователя, которая так же хороша, как и маршрутов, не существует.

+0

Благодаря Арун. То, что я сделал, добавляет представление без данных, оно в основном делает то, что вы упомянули выше. urlpatterns = [url (r '^ $', views.APIRoot.as_view()), url (r '', include (router.urls)),] – Slipstream

1

Я решил это, используя следующий подход, возможно, не самый элегантный, но он служит в качестве примера.

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) 
Смежные вопросы