2016-04-08 2 views
0

Я использую Django 1.9 и Django Rest Framework 3.3DRF - База Viewset для паров запроса подтверждения

Я создаю три новые конечные точки, которые похожи, но все еще достаточно различны, что я хочу, чтобы они были их собственные viewsets, чтобы избежать грязный код. Они не подкреплены моделью, поэтому я распространяю 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(), чтобы проверить и не возвращать что-либо в базовом классе.

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

ответ

0

Одна из причин того, почему класс Base Base лучше, это то, что вы можете добавить свой собственный вывод или хотя бы добавить 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