Есть ли способ ограничить доступ к интерфейсу DRF, сохраняя при этом доступ к конечным точкам API? - PullRequest
0 голосов
/ 10 июня 2019

Я создаю сайт, в котором Django Rest Framework используется в качестве бэкэнда, а ReactJS - в качестве внешнего У меня есть несколько конечных точек API для различных данных, т.е.

/api/
/api/users/
/api/objects/
/api/other_objects/
etc

Я не хочу, чтобы обычные пользователи имели прямой доступ к интерфейсу DRF. Если кто-то решит перейти на один из этих URL-адресов, я бы предпочел перенаправить его на страницу индекса, если у него нет статуса персонала.

Я пытался перенаправить пользователей с помощью декораторов в представлениях:

from django.contrib.auth.decorators import user_passes_test

def staff_check(user):
    if user.is_authenticated and user.is_staff:
        return True
    else:
        return False

@user_passes_test(staff_check, login_url='/', redirect_field_name=None)
@api_view(['GET'])
def api_root(request, format=None):
    return Response({
        'users': reverse('user-list', request=request, format=format),
        'objects': reverse('objects-list', request=request, format=format),
        'other_objects': reverse('other-objects-list', request=request, format=format)
    })

Он отлично работает в том, что касается перенаправления, но когда мое приложение React пытается получить данные с конечных точек с помощью декораторов, оно также перенаправляется.

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

class ObjectsList(generics.ListCreateAPIView):
    queryset = Object.objects.all().order_by('created')
    serializer_class = ObjectSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

Однако он по-прежнему позволяет пользователям просматривать интерфейс (с содержимым или без него, в зависимости от разрешений). Есть ли способ сделать конечные точки доступными для команды React fetch без перенаправления, но при этом перенаправить пользователей, когда они пытаются просмотреть интерфейс?

1 Ответ

0 голосов
/ 10 июня 2019

Просто измените свой класс рендерера и удалите по умолчанию BrowsableAPIRenderer из списка.

В глобальном масштабе, например, так:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    )
}

Но в вашем случае вы можете управлять им для каждого просмотра, используя декоратор(когда интерфейс должен или не должен отображаться):

@api_view(['GET'])
@renderer_classes((JSONRenderer, BrowsableAPIRenderer))
def your_view(request, format=None):
   ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...