作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前我对单个实体有一个简单的休息设置,
您可以创建一个对象,您可以通过 id 检索它。
“POST”需要认证/许可,“RETRIEVE”不需要认证/许可。
settings.py(需要每个资源的全局身份验证/权限):
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'api.authentication.token_authentication.TokenAuthentication'
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated'
]
}
from django.utils.translation import gettext_lazy as _
from rest_framework import mixins, serializers, viewsets
from rest_framework.decorators import authentication_classes, permission_classes
from api.models import Entity
class EntitySerializer(serializers.ModelSerializer):
class Meta:
model = Entity
fields = [...]
read_only_fields = [...]
class EntityViewSet(
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet
):
queryset = Entity.objects.all()
serializer_class = EntitySerializer
@permission_classes([]) # this is ignored ?
@authentication_classes([]) # this is ignored too ?
def retrieve(self, request, *args, **kwargs):
return super().retrieve(request, *args, **kwargs)
最佳答案
选项 1。
将装饰器更改为类属性,只需将 permission_classes 设置为 IsAuthenticatedOrReadOnly
.IsAuthenticatedOrReadOnly
将允许经过身份验证的用户执行任何请求。只有当请求方法是“安全”方法之一时,才允许对未授权用户的请求;获取、头部或选项。
from rest_framework.permissions import IsAuthenticatedOrReadOnly
class EntityViewSet(
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet
):
queryset = Entity.objects.all()
serializer_class = EntitySerializer
permission_classes = (IsAuthenticatedOrReadOnly,)
permission
并根据您的需要进行定制。然后,将其设置为类属性。
permissions.py
:
from rest_framework.permissions import BasePermission
class IsStaff(BasePermission):
def has_permission(self, request, view):
return request.user.is_authenticated and request.user.is_staff
from .permissions import IsStaff
class EntityViewSet(
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet
):
queryset = Entity.objects.all()
serializer_class = EntitySerializer
permission_classes = (IsStaff,)
get_permissions
类中的方法。
from rest_framework.permissions import AllowAny
def get_permissions(self):
if self.action == 'retrieve':
return [AllowAny]
return [IsAuthenticated]
retrieve
指定任何权限方法,Django Rest Framework 将应用您在
settings.py
中指定的默认框架。 ,在这种情况下是
IsAuthenticated
.你应该做的是,对于
retrieve
方法,允许任何用户。
from rest_framework.permissions import AllowAny
@permission_classes([AllowAny])
def retrieve(self, request, *args, **kwargs):
return super().retrieve(request, *args, **kwargs)
settings.py
上的默认列表。文件。
authentication_classes
, 自
AllowAny
权限类将允许不受限制的访问,无论请求是经过身份验证还是未经身份验证。
关于Django Rest Framework - 带有身份验证/权限装饰器的 GenericViewSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58904662/
我想在我的一个 View 中创建一个用户并存储散列的用户密码。 class DetailedUserViewSet(CreateModelMixin, GenericViewSet): que
目前我对单个实体有一个简单的休息设置, 您可以创建一个对象,您可以通过 id 检索它。 “POST”需要认证/许可,“RETRIEVE”不需要认证/许可。 settings.py(需要每个资源的全局身
我的应用程序正在使用 GenericViewSet 和 ListModelMixin。我使用 filter_backends 和 filter_class 来过滤结果。 (请参阅下面的屏幕截图中的'l
我是一名优秀的程序员,十分优秀!