【问题标题】:Django rest framework : creating a user ask for authenticationDjango rest 框架:创建用户请求身份验证
【发布时间】:2021-12-11 23:47:52
【问题描述】:

我正在使用 django 用户、身份验证和权限模块,但是在 POST 请求中请求创建新用户时,它要求进行身份验证。

我得到了

{
    "detail": "Authentication credentials were not provided."
}

这是我的 serializers.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'username', 'password']

        extra_kwargs = {
            'password' : {
                'write_only':True,
                'required': True
            }
        }
    
    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        Token.objects.create(user=user) # create token for the user
        return user

    def update(self, instance, validated_data):
        instance.username = validated_data['username']
        instance.set_password(validated_data['password'])
        instance.save()

        return instance

views.py

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

    permission_classes = [IsAuthenticated, IsOwnerOfObject]
    authentication_classes = (TokenAuthentication,)

urls.py

from django.urls import path, include
from .views import UserViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('users', UserViewSet, basename = 'users')

urlpatterns = [
    path('api/', include(router.urls)), 
]

【问题讨论】:

  • 我认为您在使用 here 时遇到了同样的问题。希望对你有帮助
  • 我的问题不同,因为我使用视图集和 django 的用户模型来创建用户

标签: python django django-models django-rest-framework django-viewsets


【解决方案1】:

这是因为您设置的 permission_classes 包括 IsAuthenticated。如果您想像下面的示例代码那样通过用户创建将其公开,则必须实现允许它的自定义 Permission 类。


class CustomizedUserPermission(IsAuthenticated):
    def has_permission(self, request, view):
        if view.action == 'create':
            return True
        return super().has_permission(request, view)  
      
class UserViewSet(viewsets.ModelViewSet):
    ...
    permission_classes = [CustomizedUserPermission, ]

更新为覆盖 ViewSet 中的 get_permissions 类


class UserViewSet(viewsets.ModelViewSet):
    def get_permissions(self): 
        if self.action == 'create': 
                return [] 
        return super().get_permissions()

【讨论】:

  • 任何解决方案,无需创建另一个自定义类
  • 我已经有自定义权限类class IsOwnerOfObject(permissions.BasePermission): def has_object_permission(self, request, view, obj): return obj == request.user可以在这里做点什么
  • 您可以重写 ViewSet 类中的 get_permissions 方法,然后通过请求操作动态排除权限!
  • 我该怎么做?
  • 如果不是create action,那么viewsets会应用你声明为permission_classes的其他权限,表示为return super().get_permissions()。
猜你喜欢
  • 2012-09-02
  • 1970-01-01
  • 2020-08-25
  • 2013-06-29
  • 2017-09-26
  • 2017-11-02
  • 2018-02-12
  • 2021-06-05
  • 1970-01-01
相关资源
最近更新 更多