DRF - 用于查询参数验证的基本视图集
DRF - Base Viewset for query param validation
我正在使用 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 中,对吗?只是让最后一个 class 在 list()
中进行验证然后在所有子视图集中调用它对我来说也很奇怪从那时起我使用 list()
来验证而不是 return 基地 class.
中的任何内容
谁能告诉我解决这个问题的好方法是什么?这种情况的最佳做法是什么?我用谷歌搜索但找不到任何东西。任何意见,将不胜感激。谢谢!
为什么 Class Base class 更好的一个原因就是你可以添加自己的派生或者至少添加 MixIns,所以从纯编码的角度来看,我认为你应该只需添加您自己的 MyBaseViewSet
并从中派生 MyFirstViewset
和 MySecondViewset
。
就是说,考虑覆盖 get_queryset
而不是 list
,并使用 ListAPIView
以便获得一些默认行为,而只是 return 一个空数组,或者如果您真想return报错,通过异常:
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
我正在使用 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 中,对吗?只是让最后一个 class 在 list()
中进行验证然后在所有子视图集中调用它对我来说也很奇怪从那时起我使用 list()
来验证而不是 return 基地 class.
谁能告诉我解决这个问题的好方法是什么?这种情况的最佳做法是什么?我用谷歌搜索但找不到任何东西。任何意见,将不胜感激。谢谢!
为什么 Class Base class 更好的一个原因就是你可以添加自己的派生或者至少添加 MixIns,所以从纯编码的角度来看,我认为你应该只需添加您自己的 MyBaseViewSet
并从中派生 MyFirstViewset
和 MySecondViewset
。
就是说,考虑覆盖 get_queryset
而不是 list
,并使用 ListAPIView
以便获得一些默认行为,而只是 return 一个空数组,或者如果您真想return报错,通过异常:
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