专栏首页抠抠空间rest_framework组件

rest_framework组件

认证组件

局部认证

在需要认证的视图类里加上authentication_classes = [认证组件1类名,认证组件2类名....]

示例如下:

seralizers.py

from rest_framework import serializers
from app01 import models

class PublishSerializers(serializers.ModelSerializer):
    class Meta:
        model = models.Publish
        fields = '__all__'

auth.py

from rest_framework.authentication import BaseAuthentication
from rest_framework import exceptions
from app01 import models

class TokenAuth(BaseAuthentication):
    def authenticate(self,request):
        '''函数名必须叫authenticate'''
        # 验证条件根据需求设置(此示例为需要有token值)
        token = request.GET.get('token')
        token_obj = models.Token.objects.filter(token=token).first()
        if not token_obj:
            # 如果验证失败,需要跑出AuthenticationFailed错误
            raise exceptions.AuthenticationFailed("验证失败!")
        else:
            user = token_obj.user
            # 如果验证成功,需要返回一个元组,分别是用户以及验证类的实例对象,然后内部会赋值给request.user和request.auth
            return user.username,token_obj

views.py

from rest_framework import viewsets
from app01.auth import TokenAuth

class PublishViewSet(viewsets.ModelViewSet):
    # 在这里配置authentication_classes
    # 注意,值为一个列表,可以放多个认证组件类名   
    authentication_classes = [TokenAuth]

    queryset = models.Publish.objects.all()
    serializer_class = serializer.PublishSerializers

全局认证

在setting.py里配置如下:

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": ["app01.auth.TokenAuth",]
}

  这样配置之后,每个视图类都要经过认证成功之后才能执行下一步,

如果有某些方法不需要认证,如login函数,则需要在login函数中单独加入一个配置属性:

authentication_classes = [] #自己的类里有的话就调用此类的配置,为空既什么都不做

权限认证

局部认证

permission.py

from app01 import models
class VipPermission():

    def has_permission(self,request,view):
        # 经过认证组件之后将用户名赋值给了request.user
        # 这里可以直接取到
        username = request.user
        user = models.User.objects.filter(username=username).first()
        # 如果用户的vip值为1,即为True,则通过认证,否则return False
        if user.vip:
            return True
        else:
            return False

views.py

from rest_framework import viewsets
from app01.auth import TokenAuth
from app01.permission import VipPermission
class PublishViewSet(viewsets.ModelViewSet):
    authentication_classes = [TokenAuth]
    permission_classes = [VipPermission]

    queryset = models.Publish.objects.all()
    serializer_class = serializer.PublishSerializers

  这个时候如果登录用户是vip,则会继续执行下一步,如果是普通用户,则会返回错误信息,如下:

{"detail":"You do not have permission to perform this action."}

  如果需要自定义错误信息,只需要在类里定义一个message属性即可,如下:

message="只有超级用户才能访问"

全局认证

REST_FRAMEWORK = {
    # 认证组件
    "DEFAULT_AUTHENTICATION_CLASSES": ["app01.auth.TokenAuth",],
    # 权限组件
    "DEFAULT_PERMISSION_CLASSES": ["app01.permission.VipPermission",],
}

频率认证

局部认证

格式如下:

class VisitRateThrottle(object):
    def allow_request(self,request,view):
        # 要求访问站点的频率不能超过每分钟20次等等
        if 1:
            # 如果在限制之内,则返回True

            return True
        else:
            return False

  然后在需要进行限制的视图类中加入如下配置:

throttle_classes = [VisitRateThrottle] 

全局认证

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一个简单的rest_framework demo

    人生不如戏
  • 浅谈pipreqs组件(自动生成需要导入的模块信息)

    人生不如戏
  • Flask之请求和响应

    人生不如戏
  • 使用pdfminer解析pdf文件

    最近要做个从 pdf 文件中抽取文本内容的工具,大概查了一下 python 里可以使用 pdfminer 来实现。下面就看看怎样使用吧。

    kongxx
  • 基于maven+ssm的增删改查之添加员工实现

    具体流程:我们在index.jsp在中,点击新增按钮,弹出添加员工信息模态框,同时,我们发送ajax请求从数据库中获取部门信息,新增时可以选择部门。输入完毕信息...

    绝命生
  • cdqa使用方法

    故事尾音
  • 7-1.表单-HTML基础

    见贤思齊
  • 设计模式-享元模式

    夏天降温,各家各户使用降温神器各不一样,有的用风扇,有的用冷风扇,有的用空调,牛逼的直接有中央空调(有钱,真有钱~),重点是要用,如果没有想用那装一个,下次直用...

    逍遥壮士
  • springboot开发之实现登录功能

    2、在com.gong.springbootcurd.controller下新建LoginController.java

    绝命生
  • docker学习(2) mac中docker-machine使用vmware fusion以及配置国内镜像加速

    一、前言 先回顾下上一节创建docker-machine的过程,默认情况下docker toolbox中的docker-machine使用virtual box...

    菩提树下的杨过

扫码关注云+社区

领取腾讯云代金券