DRF权限认证的实现

首先我们定义了一个博客模型,其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因而删除失败。这样就实现了我们一个用户的权限认证。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值