【问题标题】:Custom permission not passing to generic views django rest自定义权限未传递给通用视图 django rest
【发布时间】:2020-01-27 06:53:00
【问题描述】:

我正在编写自定义权限并在通用视图中继承,但它不起作用它返回

TypeError:无法将 AnonymousUser 转换为 int。您是否尝试使用它来代替 User?

而不是User required to perform this action

我的自定义权限如下

class IsOwnedByUser(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        message = {'detail': 'User required to perform this action'}
        return obj.user == request.user

views.py

class OrderAddressView(generics.ListCreateAPIView):
    queryset = OrderAddress.objects.all()
    serializer_class = OrderAddressSerializer
    permission_classes = (IsOwnedByUser,)

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

    def get_queryset(self):
        return OrderAddress.objects.filter(user=self.request.user)

顺便说一句,当我像这样使用默认休息框架权限类时,它可以正常工作

permission_class = (permissions.IsAuthenticated,)

但是在我的自定义权限下它不起作用(谁能告诉它为什么会这样?提前谢谢!

【问题讨论】:

  • 尝试同时添加(permissions.IsAuthenticated,IsOwnedByUser,)
  • 是的,如果两者都添加,它可以工作。但它应该适用于其中之一
  • @Nerd 你所说的“它应该与其中之一一起工作”是什么意思?你只允许使用一个权限还是什么?
  • 由于用户未登录 request.user 将是匿名的,这会导致您的问题用户必须登录才能访问 request.user 在您的情况下
  • @PavanKumarTS 哦,我明白你的意思是的,你是对的,谢谢

标签: python django django-rest-framework


【解决方案1】:

实际上,正如 Pavan Kumar 告诉你的,你应该同时使用 (permissions.IsAuthenticated, IsOwnedByUser) 但是如果你只想使用一个权限,你可以创建自己的:

class IsAuthenticatedAndOwner(permissions.BasePermission):
    message = 'User required to perform this action'

    def has_permission(self, request, view):
        return request.user and request.user.is_authenticated

    def has_object_permission(self, request, view, obj):
        return obj.user == request.user

【讨论】:

    【解决方案2】:

    您还可以在 settings.py 文件中添加默认值。尝试以下方法(根据需要调整权限,就像在文档中一样):

    REST_FRAMEWORK = {
        # Use Django's standard `django.contrib.auth` permissions,
        # or allow read-only access for unauthenticated users.
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework.authentication.TokenAuthentication',
            'rest_framework.authentication.SessionAuthentication',
        ),
        'DEFAULT_PERMISSION_CLASSES': [
            'rest_framework.permissions.IsAuthenticated'
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-06
      • 2015-08-18
      • 1970-01-01
      • 2021-07-12
      • 2020-09-25
      • 1970-01-01
      • 2020-09-16
      • 2020-09-22
      • 1970-01-01
      相关资源
      最近更新 更多