DjangoRestFramework之认证组件,权限组件,频率组件

一 . 认证组件

我们现在知道的认证机制有cookie, session,session比较安全,session的信息是存在服务器上的,如果用户量足够大的话,服务器的压力也就比较大,并且django的session存到了django_session表中,不是很好操作,现在生产中使用的一个叫做token机制的方式比较多.可以使用这个机制把token存到用户信息里,当用户登录成功的时候放里面,等他来的时候就要带着这个来,而且们每次来的时候都更新token,防止被拦截.

  我们这里使用一下token,首先要建一个表,和user表一对一关系

  models.py

class User(models.Model):
    username = models.CharField(max_length=16)
    password = models.CharField(max_length=16)
    types = ((1, ‘VIP‘), (2, ‘SVIP‘), (3, ‘SSVIP‘))
    usertype = models.IntegerField(choices=types, default=1)

class UserToken(models.Model):
    user = models.OneToOneField(‘User‘)
    token = models.CharField(max_length=64)

  URL

url(r‘^login/$‘, views.LoginView.as_view()),  # 别忘了$符号结尾

  视图函数,每次登录后自动刷新token

import uuid

# 用户登录认证
class UserAuth(APIView):
    RET = {
        ‘code‘: None,
        ‘userinfo‘: None,
        ‘msg‘: None,
        ‘token‘: None
    }

    def post(self, request):
        username = request.data.get(‘username‘)
        password = request.data.get(‘password‘)
        user_obj = models.User.objects.filter(username=username, password=password).first()
        if user_obj:
            random_str = uuid.uuid4()
            models.UserToken.objects.update_or_create(    # 有就更新,没有就创建
                user=user_obj,
                defaults={
                    ‘token‘: random_str,
                }
            )
            self.RET[‘code‘] = 0  # 跟前端约定好,0表示成功
            self.RET[‘userinfo‘] = username
            self.RET[‘msg‘] = ‘success‘
            self.RET[‘token‘] = random_str
        else:
            self.RET[‘code‘] = -1
            self.RET[‘userinfo‘] = username
            self.RET[‘msg‘] = ‘failure‘
        return Response(self.RET)

  我们这里写一下DRF的认证组件

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

# drf提供认证失败的异常
class UserAuthToken(BaseAuthentication):

    # authenticate方法是固定的,并且必须写这个名字,是request新对象
    def authenticate(self, request):
        token = request.query_params.get(‘token‘)  # 类似于GET.get(‘token‘)
        token_obj = models.UserToken.objects.filter(token=token).first()
        if token_obj:
            return token_obj.user, token   # 要么就返回两个值,要么就不返回
        else:
            return AuthenticationFailed(‘认证失败‘)  

  我们需要把这个认证组件 写到每一个url对应的视图函数中,加上认证,有token就可以访问,没有就拒绝

class BookHandle(APIView):
    authentication_classes = [UserAuthToken, ]  #一进到这个函数就进行验证,变量名必须是这个,认证组件需要从所在文件中导入

    # 获取所有数据
    def get(self, request):
        book_obj_list = models.Book.objects.all()
        book_res = BookSerializer(book_obj_list, many=True)
        return Response(book_res.data)

  需要补两张成功与失败的对比图!!!

  全局视图组件(写在settings.py中)

  

二 . 权限组件

  权限组件

from rest_framework.permissions import BasePermission
class UserPermission(BasePermission):
    message = "SVIP才能访问!"  # 变量只能叫做message,权限不够的话返回message里面的数据

    def has_permission(self, request, view):  # view是用权限的视图函数
        if request.user.usertype == 3:   # user表中usertype的字段表示权限级别
            return True  # 通过权限,只能写True或False
        return False  # 没有通过

  视图函数

class BookHandle(APIView):
    permission_classes = [UserPer, ]  # 一进函数就验证,只有有权限的才能访问下面的数据
    # 获取所有数据
    def get(self, request):
        book_obj_list = models.Book.objects.all()
        book_res = BookSerializer(book_obj_list, many=True)
        return Response(book_res.data)

  全局视图权限(写在settings.py文件)

三 . 频率组件

  内置的throttles类

from rest_framework.throttling import SimpleRateThrottle

class VisitThrottle(SimpleRateThrottle):

    scope="visit_rate"   # 限制访问次数用的
    def get_cache_key(self, request, view):   # 这个方法是固定的

        return self.get_ident(request)

  视图函数

class BookHandle(APIView):

    throttle_classes = [VisitThrottle, ]  # 添加访问频率,需要从该类所在位置引入

    # 获取所有数据
    def get(self, request):
        book_obj_list = models.Book.objects.all()
        book_res = BookSerializer(book_obj_list, many=True)
        return Response(book_res.data)

原文地址:https://www.cnblogs.com/attila/p/10805858.html

时间: 2024-10-10 13:46:22

DjangoRestFramework之认证组件,权限组件,频率组件的相关文章

认证、权限、频率、自定义签发token-多方式登录

目录 三大认证流程图 路由配置 认证组件 权限组件 自定义权限类 配置drf自带的权限类 drf-jwt 签发token源码分析 多方式登录 签发token VIP用户认证权限例子 频率组件 自定义频率类 三大认证流程图 路由配置 在应用下新建文件router.py # router.py from rest_framework.routers import Route, DynamicRoute, SimpleRouter as DRFSimpleRouter class SimpleRout

restful(3):认证、权限、频率

models.py中: class UserInfo(models.Model): name = models.CharField(max_length=32) psw = models.CharField(max_length=32) user_type_choices = ((1,"普通"),(2,"VIP"),(3,"SVIP")) user_type = models.SmallIntegerField(choices=user_type

04,认证、权限、频率

.wiz-editor-body .wiz-code-container { position: relative; padding: 8px 0; margin: 5px 25px 5px 5px; text-indent: 0; text-align: left } .CodeMirror { font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; color: black; font-size: 0

认证、权限、视图组件

drf组件 认证组件 models.py class User(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=32) user_type = models.IntegerField(choice=(1,'超级管理员'),(2,'普通管理员'),(3,'用户')) #token跟uesr表做一对一关联 class Token(models.Model): user =

DRF的版本、认证、权限

DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们项目越来越更新~版本就越来越多~~我们不可能新的版本出了~以前旧的版本就不进行维护了~~~ 那我们就需要对版本进行控制~~这个DRF也给我们提供了一些封装好的版本控制方法~~ 版本控制怎么用 之前我们学视图的时候知道APIView,也知道APIView返回View中的view函数,然后调用的dispatch方法~ 执行self.initial方法之前是各种

DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分页组件 七 xxx 八 xxx 一 认证组件 1. 局部认证组件 我们知道,我们不管路由怎么写的,对应的视图类怎么写的,都会走到dispatch方法,进行分发, 在咱们看的APIView类中的dispatch方法的源码中,有个self.initial(request, *args, **kwargs),那么认证.权限.频率这三个默认组件都在这个方法里面了,如果我们自己没有做这三个组件的配置,那么会使用源码中默

Django的rest_framework的权限组件和频率组件源码分析

前言: Django的rest_framework一共有三大组件,分别为认证组件perform_authentication,权限组件check_throttles: 我在前面的博客中已经梳理了认证组件,不知道大家有没有看懂:在这里我把认证的组件的博客地址在贴出来,不清楚的人可以看下 局部设置认证组件的博客:https://www.cnblogs.com/bainianminguo/p/10480887.html 全局设置认证组件的博客:https://www.cnblogs.com/baini

认证 权限 视图 频率

认证组件 使用:写一个认证类,继承BaseAuthentication 在类中写authenticate方法,把request对象传入 能从request对象中取出用户携带的token根据token判断是否登录过 如果登录过,返回两个值 user对象 ,token对象(或者其他自定义的对象) 如果没有登录过抛异常 from rest_framework.authentication import BaseAuthentication from app01 import models from r

DRF的权限和频率

DRF的权限 权限组件源码 权限和频率以及版本认证都是在initial方法里初始化的 我们的权限类一定要有has_permission方法~否则就会抛出异常~~这也是框架给我提供的钩子~~ 在rest_framework.permissions这个文件中~存放了框架给我们提供的所有权限的方法~~ 主要说下BasePermission 这个是我们写权限类继承的一个基础权限类~~~ 权限的详细用法 initial方法在初始化的时候是有顺序的:版本-->权限-->频率 写权限类 class MyPe