2015-04-25 18 views
7

Tôi muốn đảm bảo request.user chỉ có thể đưa ra yêu cầu POST để tạo chủ đề diễn đàn trong đó chúng là auther. Với PUT và DELETE tôi có thể đạt được điều đó bằng cách sử dụng has_object_permission nhưng với POST tôi không thể làm điều đó, tôi đoán vì đối tượng chưa được tạo ra.Quyền Django Rest cấp đối tượng trên POST

class TopicPermission(IsAuthenticatedOrReadOnly): 
    """ 
    Any user should be able to read topics but only authenticated 
    users should be able to create new topics. An owner or moderator 
    should be able to update a discussion or delete. 
    """ 
    def has_object_permission(self, request, view, obj): 
     if request.method in SAFE_METHODS: 
      return True 

     # Instance must have an attribute named `author` or moderator 
     return obj.author == request.user or request.user.forum_moderator 

Tôi làm cách nào để xác minh số request.user == obj.author trong yêu cầu POST?

+1

Bạn có một 'author' lĩnh vực trên serializer mà bạn đang cố gắng để đảm bảo được thiết lập cho người dùng hiện nay khi cresting sự vật? Có nhiều cách tốt hơn để làm điều đó hơn bằng cách thực hiện kiểm tra quyền. –

+0

vâng, không phải vậy. Nó hoạt động tốt cho PUT và DELETE, nhưng với POST has_object_permission không hoạt động. – awwester

+1

Bởi "không hoạt động", bạn có nghĩa là "không được gọi là", "gây ra lỗi" hay "không bao giờ vượt qua"? Nó không rõ ràng những gì bạn đang cố gắng làm trong câu hỏi của bạn, và nó [mùi giống như một vấn đề XY] (http://meta.stackexchange.com/q/66377/159034). –

Trả lời

3

tôi đã kết thúc làm việc xác nhận trong viewset thay vì serializer:

class TopicViewSet(viewsets.ModelViewSet): 
    permission_classes = (TopicPermission,) 
    queryset = Topic.objects.all() 
    serializer_class = TopicSerializer 

    def create(self, request, *args, **kwargs): 
     """ 
     verify that the POST has the request user as the obj.author 
     """ 
     if request.data["author"] == str(request.user.id): 
      serializer = self.get_serializer(data=request.data) 
      serializer.is_valid(raise_exception=True) 
      self.perform_create(serializer) 
      headers = self.get_success_headers(serializer.data) 
      return Response(serializer.data, status=201, headers=headers) 
     else: 
      return Response(status=403) 
Các vấn đề liên quan