如何在 Django 休息框架的 ViewSet 中设置一个方法不需要身份验证
How to set a method in Django rest framework's ViewSet to not require authentication
我有 viewset 如下所示:
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
方法不需要身份验证呢?
如您所知,在使用令牌实现身份验证后,所有请求都应该在 header 中包含 Token
,任何没有的请求都会出现 403 错误。
根据 DRF 问题跟踪器上的 this issue,最好的方法似乎是创建自定义权限 class。视图对象有一个 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
中更详细的
(此处复制的代码符合不只是 link 退出的 SO 政策,以防 link 被破坏或更改。)
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
我有 viewset 如下所示:
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
方法不需要身份验证呢?
如您所知,在使用令牌实现身份验证后,所有请求都应该在 header 中包含 Token
,任何没有的请求都会出现 403 错误。
根据 DRF 问题跟踪器上的 this issue,最好的方法似乎是创建自定义权限 class。视图对象有一个 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
中更详细的
(此处复制的代码符合不只是 link 退出的 SO 政策,以防 link 被破坏或更改。)
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