DRF IsAuthenticated不起作用

chi*_*der 8 django django-views django-serializer django-rest-framework

我将ListView集权限设置为IsAuthenticated,但是当我在Incognito窗口中点击URL时.我能够查看数据.虽然当我将权限设置为IsAdmin时,它通过向我显示错误来完美地工作.这是我的序列化器

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'
         ]
Run Code Online (Sandbox Code Playgroud)

以下是我的观点

from rest_framework.permissions import IsAuthenticated

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

设置文件

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    )
}
Run Code Online (Sandbox Code Playgroud)

中间件设置

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',
]
Run Code Online (Sandbox Code Playgroud)

当我尝试通过在BlogListAPIView上调用get_object来访问用户时,它会抛出错误,而不是JSON可序列化.出于某种原因,中间件将AnonymousUser作为用户.如果有AnonymousUser登录,则会失败IsAuthenticated权限.这就是发生的事情(我猜).但是我无法注销AnonymousUser.为什么要访问AnonymousUser以及如何将他注销?

Arm*_*ani 5

当然,您的问题中未列出其他一些问题。我用您提供的代码片段创建了一个新项目,当我未登录而访问URL时将获得http401。我在Github中提供了代码:

得到https://github.com/Rmaan/pastebin/tree/so-47596482

运行服务器并浏览到http:// localhost:8000 / blog


Big*_*her 2

从 Django 1.9 升级到 Django 1.10 并使用 DRF 3.3.7 后,该问题消失了。