Django Rest Framework 的 IsAuthenticated() 方法对于 AnonymousUser 失败
Django Rest Framework's IsAuthenticated() method is failing for AnonymousUser
我有一个 ListView,它的权限设置为 IsAuthenticated,当我在隐身 window 中点击 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 来访问用户时,它会抛出一个错误 is not JSON serializable。出于某种原因,中间件将 AnonymousUser 作为用户。如果有 AnonymousUser 登录,则 IsAuthenticated 权限应该失败。这基本上应该发生
为什么 AnonymousUser 被访问而 IsAuthenticated() 失败?
肯定还有一些问题没有在你的问题中列出。我用你提供的片段创建了一个新项目,当我点击 URL 没有登录时会得到 http 401。我在 Github:
中提供了代码
得到https://github.com/Rmaan/pastebin/tree/so-47596482
运行服务器并浏览到 http://localhost:8000/blog
从 Django 1.9 升级到 Django 1.10 并使用 DRF 3.3.7 后问题已解决。
我有一个 ListView,它的权限设置为 IsAuthenticated,当我在隐身 window 中点击 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 来访问用户时,它会抛出一个错误 is not JSON serializable。出于某种原因,中间件将 AnonymousUser 作为用户。如果有 AnonymousUser 登录,则 IsAuthenticated 权限应该失败。这基本上应该发生 为什么 AnonymousUser 被访问而 IsAuthenticated() 失败?
肯定还有一些问题没有在你的问题中列出。我用你提供的片段创建了一个新项目,当我点击 URL 没有登录时会得到 http 401。我在 Github:
中提供了代码得到https://github.com/Rmaan/pastebin/tree/so-47596482
运行服务器并浏览到 http://localhost:8000/blog
从 Django 1.9 升级到 Django 1.10 并使用 DRF 3.3.7 后问题已解决。