【问题标题】:How to add django rest framework permissions on specific method only ?如何仅在特定方法上添加 django rest 框架权限?
【发布时间】:2016-10-05 03:51:40
【问题描述】:

我在用户模型的 rest API 中有以下功能。我想仅对 POST 请求设置 AllowAny 权限。谁能帮帮我。

class UserList(APIView):
    """Get and post users data."""

    def get(self, request, format=None):
        """Get users."""
        users = User.objects.all()
        serialized_users = UserSerializer(users, many=True)
        return Response(serialized_users.data)

    def post(self, request, format=None):
        """Post users."""
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)

【问题讨论】:

  • GET 请求会发生什么?
  • @RahulGupta 在GET请求的情况下需要认证。

标签: django django-rest-framework django-permissions


【解决方案1】:

http://www.django-rest-framework.org/api-guide/permissions/

根据上述 URL,您必须编写一个自定义权限类

class ExampleView(APIView):
    permission_classes = (MyCustomAuthenticated,)

根据 POST 和 GET 在 MyCUstomAuthenticated 中使用 AllowAny 或 IsAuthenticated 编写您自己的逻辑

【讨论】:

    【解决方案2】:

    您可以编写一个custom Permission classIsPostOrIsAuthenticated,这将允许不受限制地访问POST 请求,但只允许经过身份验证的GET 请求。

    要实现自定义权限IsPostOrIsAuthenticated,重写BasePermission 类并实现.has_permission(self, request, view) 方法。如果请求应该被授予访问权限,该方法应该返回True,否则返回False

    from rest_framework import permissions
    
    class IsPostOrIsAuthenticated(permissions.BasePermission):        
    
        def has_permission(self, request, view):
            # allow all POST requests
            if request.method == 'POST':
                return True
    
            # Otherwise, only allow authenticated requests
            # Post Django 1.10, 'is_authenticated' is a read-only attribute
            return request.user and request.user.is_authenticated
    

    因此,所有POST 请求都将被授予不受限制的访问权限。对于其他请求,将需要身份验证。

    现在,您需要在全局设置中包含此自定义权限类。

    REST_FRAMEWORK = {
        'DEFAULT_PERMISSION_CLASSES': (
            'my_app.permissions.IsPostOrIsAuthenticated',
        )
    }
    

    【讨论】:

    • 可能需要从 is_authenticated 中删除括号。
    • @BradenHolt 是的,发布 Django 1.10,它是一个属性。更新了答案。谢谢!
    • 如果您只想允许通过 POST 调用的特定操作,但不允许通过 POST 执行的所有其他操作,该怎么办?
    • @Overdrivr 您能否提供一个示例,提供更多详细信息,例如您在 POST 中所说的操作或其他问题。
    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2017-04-13
    • 2016-11-20
    • 2013-06-16
    • 2020-09-22
    • 1970-01-01
    • 2014-08-25
    相关资源
    最近更新 更多