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