在Django rest框架中自定义详细路由的权限和响应

在Django rest框架中自定义详细路由的权限和响应,django,django-rest-framework,django-views,Django,Django Rest Framework,Django Views,概述-我正在创建一个Django REST API,它从嵌套url路由返回数据。到目前为止,我发现最好的方法是手动将url正则表达式添加到url.py,然后在我的视图中使用@detail_route来检索过滤后的序列化程序数据 现在我有用户对象和目标对象,它们需要基于身份验证等不同的数据响应 如何自定义详图管线来执行此操作?例如: 如果用户是管理员,则可以在/api/v2/users url处使用“post”方法。如果它们没有经过身份验证,则会得到错误的请求和响应 如果用户是管理员,他们可以使用

概述-我正在创建一个Django REST API,它从嵌套url路由返回数据。到目前为止,我发现最好的方法是手动将url正则表达式添加到url.py,然后在我的视图中使用@detail_route来检索过滤后的序列化程序数据

现在我有用户对象和目标对象,它们需要基于身份验证等不同的数据响应

如何自定义详图管线来执行此操作?例如:

如果用户是管理员,则可以在/api/v2/users url处使用“post”方法。如果它们没有经过身份验证,则会得到错误的请求和响应

如果用户是管理员,他们可以使用“get”方法检索所有用户名、电子邮件和密码,但如果不是,他们只能获取用户名

url.py

urlpatterns = [

    url(r'^api/v2/users/$',
        UserViewSet.as_view({'get': 'users', 'post': 'users', 'put': 'users',
                             'patch': 'users', 'delete': 'users'}),
        name='user_list'),

    url(r'^api/v2/user/(?P<uid>\d+)/goals/$',
        UserViewSet.as_view({'get': 'user_goals', 'post': 'user_goals', 'put': 'user_goals',
                             'patch': 'user_goals', 'delete': 'user_goals'}),
        name='user_goals_list'),
]
views.py

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = serializers.UserSerializer

    @detail_route(methods=['get', 'post', 'delete', 'put', 'patch', ])
    def users(self, request):
        users = User.objects.all()
        serializer = serializers.UserSerializer(
            users, many=True
        )
        return Response(serializer.data)

    @detail_route(methods=['get', 'post', 'delete', 'put', 'patch', ])
    def user_goals(self, request, uid):
        goals = Goal.objects.filter(user_id=uid)
        serializer = serializers.GoalSerializer(
            goals, many=True
        )
        return Response(serializer.data)

    @detail_route(methods=['get', 'post', 'delete', 'put', 'patch', ])
    def user_goal_detail(self, request, uid, gid):
        goal = Goal.objects.filter(user_id=uid, id=gid)
        serializer = serializers.GoalSerializer(
            goal, many=True
        )
        return Response(serializer.data)

至于嵌套路由,我建议您查看一下包或类似的包,它会使您的路由更容易,查看
SimpleRouter
NestedSimpleRouter

如果用户是管理员,则可以在/api/v2/users url处使用“post”方法。如果它们没有经过身份验证,则会得到错误的请求和响应

@detail\u route
decorator可以接收一个
permission\u classes
参数,您可以在其中指定执行声明的操作所需的权限,就像您正在使用的
ViewSet
一样

但是,您的示例为
用户
模型显示了一个
模型视图集
,这意味着您已经公开了多个操作,以及多个
通用视图集
相关奖励(
获取序列化程序
获取对象
,等等):

因此,例如,如果您想要执行
GET/api/v2/users/
,通过路由器或
url.py上的
GET:'list'}
链接它,您可以基于用户覆盖
GET\u serializer\u类
方法:

def get_serializer_class(self):
    """
    Return the class to use for the serializer.
    Defaults to using `self.serializer_class`.

    You may want to override this if you need to provide different
    serializations depending on the incoming request.

    (Eg. admins get full serialization, others get basic serialization)
    """
    assert self.serializer_class is not None, (
        "'%s' should either include a `serializer_class` attribute, "
        "or override the `get_serializer_class()` method."
        % self.__class__.__name__
    )

    return self.serializer_class
在这种情况下,您还可以通过允许任何人使用
安全方法
,或者检查管理员状态,来使用
用户视图集
权限类
参数:

from rest_framework.permissions import BasePermission, SAFE_METHODS

class IsAdminOrReadOnly(BasePermission):

    def has_permission(self, request, view):
        if request.method in SAFE_METHODS:
            return True

        return request.user and request.user.is_staff

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = serializers.UserSerializer
    permission_classes = (IsAdminOrReadOnly,)
    ...

我可能会迟到,但希望这对以后的其他人会有帮助。

至于嵌套路由,我建议您查看一下包或类似的包,它会使您的路由更容易,查看
SimpleRouter
NestedSimpleRouter

如果用户是管理员,则可以在/api/v2/users url处使用“post”方法。如果它们没有经过身份验证,则会得到错误的请求和响应

@detail\u route
decorator可以接收一个
permission\u classes
参数,您可以在其中指定执行声明的操作所需的权限,就像您正在使用的
ViewSet
一样

但是,您的示例为
用户
模型显示了一个
模型视图集
,这意味着您已经公开了多个操作,以及多个
通用视图集
相关奖励(
获取序列化程序
获取对象
,等等):

因此,例如,如果您想要执行
GET/api/v2/users/
,通过路由器或
url.py上的
GET:'list'}
链接它,您可以基于用户覆盖
GET\u serializer\u类
方法:

def get_serializer_class(self):
    """
    Return the class to use for the serializer.
    Defaults to using `self.serializer_class`.

    You may want to override this if you need to provide different
    serializations depending on the incoming request.

    (Eg. admins get full serialization, others get basic serialization)
    """
    assert self.serializer_class is not None, (
        "'%s' should either include a `serializer_class` attribute, "
        "or override the `get_serializer_class()` method."
        % self.__class__.__name__
    )

    return self.serializer_class
在这种情况下,您还可以通过允许任何人使用
安全方法
,或者检查管理员状态,来使用
用户视图集
权限类
参数:

from rest_framework.permissions import BasePermission, SAFE_METHODS

class IsAdminOrReadOnly(BasePermission):

    def has_permission(self, request, view):
        if request.method in SAFE_METHODS:
            return True

        return request.user and request.user.is_staff

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = serializers.UserSerializer
    permission_classes = (IsAdminOrReadOnly,)
    ...
我可能会迟到,但希望这对以后的其他人会有帮助