DRF — базовый набор представлений для проверки параметров запроса

Я использую Django 1.9 и Django Rest Framework 3.3.

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

class MyFirstViewset(viewsets.ViewSet):

    def list(self, request):
        some_param = request.query_params.get('someparam')
        if not some_param:
            return Response('someparam query parameter is required', status.HTTP_400_BAD_REQUEST)
        some_other_param = request.query_params.get('someotherparam')
        if not some_other_param:
              return Response('someotherparam query parameter is required', status.HTTP_400_BAD_REQUEST)


class MySecondViewset(viewsets.ViewSet):

    def list(self, request):
        some_param = request.query_params.get('someparam')
        if not some_param:
            return Response('someparam query parameter is required', status.HTTP_400_BAD_REQUEST)
        some_other_param = request.query_params.get('someotherparam')
        if not some_other_param:
              return Response('someotherparam query parameter is required', status.HTTP_400_BAD_REQUEST)

Как видите... он не очень СУХОЙ. Очевидным решением было бы наследование с базовым набором представлений, выполняющим аналогичные части проверки, проблема в том, что я не уверен, как лучше всего делать что-то подобное с DRF. Хотел бы я сделать функцию проверки защищенного доступа и вызвать ее? Но если бы все, что я делал, это проверял диктофон на наличие ключей, то это даже не обязательно было бы в ViewSet, верно? Просто то, что последний класс выполняет проверку в list(), а затем вызывает это во всех дочерних наборах представлений, также кажется мне странным, поскольку тогда я использую list() для проверки и фактически ничего не возвращаю в базовом классе.

Может ли кто-нибудь сказать мне, какой хороший подход к этому был бы? Какова наилучшая практика для таких случаев? Я погуглил, но ничего не нашел. Любой совет будет принят во внимание. Спасибо!


person TheMethod    schedule 08.04.2016    source источник


Ответы (1)


Одна из причин, по которой базовый класс класса лучше, заключается именно в том, что вы можете добавить свой собственный производный класс или, по крайней мере, добавить MixIns, поэтому с точки зрения чистого кодирования я думаю, что вы должны просто добавить свой собственный MyBaseViewSet и получить MyFirstViewset и MySecondViewset из него. .

Тем не менее, рассмотрите возможность перезаписи get_queryset вместо list и используйте ListAPIView, чтобы получить поведение по умолчанию и просто вернуть пустой массив или, если вы действительно хотите вернуть ошибку, через исключение:

class MyBaseViewSet(generics.ListAPIView):
    serializer_class = YourSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def get_queryset(self):
        some_param = self.request.query_params.get('someparam')
        if not some_param:
             raise exceptions.PermissionDenied
person dkarchmer    schedule 09.04.2016