首先我们定义了一个博客模型,其model.py和serializers.py以及views.py文件分别如下
1.models.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Blog(models.Model):
user=models.ForeignKey(User,on_delete=models.CASCADE,related_name="blog",verbose_name="作者")
title=models.CharField(max_length=100,verbose_name="文章标题")
text=models.TextField(verbose_name="内容")
add_time=models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name="博客"
verbose_name_plural=verbose_name
unique_together=("title","user")
def __str__(self):
return self.title
2 serializers.py
from rest_framework import serializers
from .models import Blog
class BlogSerializer(serializers.ModelSerializer):
user=serializers.HiddenField(default=serializers.CurrentUserDefault())
class Meta:
model=Blog
fields=("user","title","text",)
3 views.py
from django.shortcuts import render
from rest_framework import mixins,viewsets
from .serializers import BlogSerializer
from .models import Blog
from rest_framework.permissions import IsAuthenticated
# Create your views here.
class BlogViewSet(mixins.CreateModelMixin,
mixins.ListModelMixin,viewsets.GenericViewSet):
queryset = Blog.objects.all()
serializer_class = BlogSerializer
这里可以看下我们最终实现的效果如何。
这里我们可以看到我创建了两个博客实例,两个标题一个是python学习,一个是python,他们都是属于用户ll_admin。但是此时如果我们仔细观察就会发现此时右上角有个Log In,说明此时我们并没有用户登录但是却能访问用户的数据,这是不合理的。因此我们需要对此进行限制,只有让用户在登录之后才能访问相应的数据。我们只需要将代码改为如下即可
from django.shortcuts import render
from rest_framework import mixins,viewsets
from rest_framework.permissions import IsAuthenticated
from .serializers import BlogSerializer
from .models import Blog
from rest_framework.permissions import IsAuthenticated
# Create your views here.
class BlogViewSet(mixins.CreateModelMixin,
mixins.ListModelMixin,viewsets.GenericViewSet):
queryset = Blog.objects.all()
permission_classes = (IsAuthenticated,)
serializer_class = BlogSerializer
我们只需要添加一个permission_class即可完成这个功能。最后效果如下
那接下来如果我们只想要用户操作自己的数据该怎么实现呢。比如说我们只想让用户浏览自己的文章并且只能删除自己的文章。我们可以将代码改为如下
from django.shortcuts import render
from rest_framework import mixins,viewsets
from rest_framework.permissions import IsAuthenticated
from .serializers import BlogSerializer
from .models import Blog
from rest_framework.permissions import IsAuthenticated
from .permissions import IsOwnerOrReadOnly
# Create your views here.
class BlogViewSet(mixins.CreateModelMixin,
mixins.ListModelMixin,mixins.DestroyModelMixin,viewsets.GenericViewSet):
permission_classes = (IsAuthenticated,IsOwnerOrReadOnly,)
serializer_class = BlogSerializer
def get_queryset(self):
return Blog.objects.filter(user=self.request.user)
为了实现删除功能我们继承了mixins.DestroyModelMixin,同时我们添加了另外一个权限即IsOwnerOrReadOnly,我们可以看下它具体的实现代码
from rest_framework.permissions import BasePermission
from rest_framework.permissions import SAFE_METHODS
class IsOwnerOrReadOnly(BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in SAFE_METHODS:
return True
return obj.user==request.user
这是我们自己定义的一个权限类,我们重构了has_object_permission方法。首先我们判断请求方法是不是在SAFE_METHODS中,SAFE_METHODS 是一个元祖其值为(‘GET’, ‘HEAD’, ‘OPTIONS’),所以我们如果我们是通过get方法访问某个页面就会返回True,最后我们在views.py文件中重构get_queryset()方法并将queryset属性删除。这样就实现了用户只能访问自己的数据。倘若我们是要删除我们的数据has_object_permission方法会判断要删除的对象的user属性是不是等于请求的当前用户。不是则返回False因而删除失败。这样就实现了我们一个用户的权限认证。