首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django Rest Framework自定义权限验证

Django Rest Framework自定义权限验证
EN

Stack Overflow用户
提问于 2018-10-20 00:25:37
回答 1查看 1.8K关注 0票数 2

我有一个定制的ViewSet,它可以对数据库进行组合查询和更新。我希望建立不同级别的权限,这样我就可以授权一些用户在视图上发送GET方法,并允许其他一些用户请求POSTPUT方法。

在我找到的文件里,对于类视图,所有权限都被认为是全局的,因此我不知道如何对list方法应用一些权限,以及对ViewSet的createupdate方法应用一些不同的权限。

这是ViewSet的主要代码:

代码语言:javascript
复制
class ReservationCompositionViewSet(viewsets.ViewSet):

    def list(self, request, pk):
            reservation = models.Reservation.objects.filter(booking=pk).order_by('timestamp').last()
            if reservation == None:
                raise CustomValidation(_('There is not such Reservation: {}'.format(pk)), 'booking', status.HTTP_400_BAD_REQUEST)

            result_set = serializers.ReservationSerializer(reservation).data

            result_set['pax'] = self.get_reservation_people(reservation)
            result_set['itinerary'] = self.get_reservation_composition(reservation)

            return Response(result_set)
    ...

    def create(self, request):
        reservation_data = request.data
        user = request.user

        reservation = models.Reservation()
        reservation.booking = reservation_data['booking']
        reservation.agency = models.Agency.objects.get(id=reservation_data['agency'])
        reservation.comment = reservation_data.pop('comment', None)
        reservation.status = reservation_data.pop('status', 'UNCONFIRMED')
        if reservation.status == None:
            reservation.status = 'UNCONFIRMED'
        reservation.arrival_date = reservation_data['arrival_date']
        reservation.departure_date = reservation_data['departure_date']
        reservation.confirmation = reservation_data.pop('confirmation', None)
        reservation.is_invoiced = reservation_data['is_invoiced']
        reservation.user = user

        reservation.save()

        reservation_to_return = serializers.ReservationSerializer(reservation).data
        reservation_to_return['pax'] = self.save_reservation_people(reservation, reservation_data.pop('pax'))
        reservation_to_return['itinerary'] = self.save_reservation_components(reservation, reservation_data.pop('itinerary'))

        return Response(reservation_to_return)

    def update(self, request, pk):
        reservation_data = request.data
        user = request.user

        reservation = self.save_reservation(reservation_data, user, pk)

        reservation_to_return = serializers.ReservationSerializer(reservation).data
        reservation_to_return['pax'] = self.save_reservation_people(reservation, reservation_data.pop('pax'))
        reservation_to_return['itinerary'] = self.save_reservation_components(reservation, reservation_data.pop('itinerary'))

        return Response(reservation_to_return)
        ...

我希望在调用方法can_view时验证用户具有list()权限,在调用create()update()方法时验证can_edit权限。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-20 10:36:10

视图集的list()create()update()方法是路由器对应的HTTP方法的映射

因此,您可以创建一个自定义权限,该权限检查HTTP方法的类型,以确定正在发生的操作。

例如:

代码语言:javascript
复制
from rest_framework import permissions

class ReservationCompositionPermission(permissions.BasePermission):

    def has_permission(self, request, view):
        if request.method == 'GET':
            return request.user.has_perm('can_view')
        elif request.method in ('POST', 'PUT', 'PATCH'):
            return request.user.has_perm('can_edit')
        return False

并在视图集中指定:

代码语言:javascript
复制
class ReservationCompositionViewSet(viewsets.ViewSet):
    permission_classes = (ReservationCompositionPermission, )
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52901382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档