我有一个ListView,它的权限设置为IsAuthenticated,当我在隐身窗口中单击URL时,无需用户登录就可以查看数据。

这是我的序列化器

class BlogListSerializer(ModelSerializer):
    url = HyperlinkedIdentityField(
    view_name="blog_api:post_detail",
    lookup_field="slug"
    )
    class Meta:
        model = Blog
        fields = [
           'url',
           'title',
           'category',
           'date',
           'publish',
           'draft'
         ]

下面是我的看法
from rest_framework.permissions import IsAuthenticated

class BlogListAPIView(ListAPIView):
    queryset = Blog.objects.filter(publish=True, draft=False)
    serializer_class = BlogListSerializer
    permission_classes = [IsAuthenticated]

设置文件
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    )
}

中间件设置
MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

因此,发生的事情是,当我尝试通过在BlogListAPIView上调用get_object来访问用户时,它抛出一个不可JSON序列化的错误。由于某种原因,中间件将AnonymousUser作为用户。如果登录了AnonymousUser,则它将失败IsAuthenticated权限。这基本上是应该发生的
为什么要访问AnonymousUser并且IsAuthenticated()失败?

最佳答案

从Django 1.9升级到Django 1.10并使用DRF 3.3.7消除了此问题。

10-07 13:30