如何在Django Rest Framework的ViewSet中设置一个方法不需要身份验证。

6

我有一个像下面这样的视图集

from rest_framework import viewsets
from paas.serializers import UserSerializer
import logging


logger=  logging.getLogger(__name__)

class UserViewSet(viewsets.ViewSet):
    def list(self,request):
        pass

    def create(self,request):
        logger.info(request.data)
        current_user = UserSerializer.create()

此外,我在我的代码中使用DRF令牌进行身份验证。如何简单地表达这个create方法不需要身份验证呢? 正如你所知,在使用令牌进行身份验证之后,所有的请求都应该在头部包含Token,如果没有任何请求则会得到403错误。
1个回答

5
根据DRF问题跟踪器上的此问题,最好的方法似乎是创建一个自定义权限类。视图对象具有一个action属性,可用于根据ViewSet的每个子操作变化响应内容。
class IsCreationOrIsAuthenticated(permissions.BasePermission):

    def has_permission(self, request, view):
        if not request.user.is_authenticated():
            if view.action == 'create':
                return True
            else:
                return False
        else:
            return True

或者更详细的内容请参考AssembledAdam

(根据SO政策,代码已在此处复制以防链接失效或被更改。)

class AnonCreateAndUpdateOwnerOnly(permissions.BasePermission):
    """
    Custom permission:
        - allow anonymous POST
        - allow authenticated GET and PUT on *own* record
        - allow all actions for staff
    """

    def has_permission(self, request, view):
        return view.action == 'create' or request.user and request.user.is_authenticated

    def has_object_permission(self, request, view, obj):
        return view.action in ['retrieve', 'update', 'partial_update'] and obj.id == request.user.id or request.user.is_staff

class ListAdminOnly(permissions.BasePermission):
    """
    Custom permission to only allow access to lists for admins
    """

    def has_permission(self, request, view):
        return view.action != 'list' or request.user and request.user.is_staff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接