RESTful-rest_framework认证组件、权限组件、频率组件-第五篇

认证组件格式:

1 写一个认证类
        from rest_framework.authentication import BaseAuthentication
        class MyAuth(BaseAuthentication):
            def authenticate(self,request):
        #         request  是封装后的
                token = request.query_params.get(‘token‘)
                ret = models.UserToken.objects.filter(token=token).first()
                if ret:
        #             认证通过
                    return
                else:
                    raise AuthenticationFailed(‘认证失败‘)
            #可以不写了
            def authenticate_header(self,ss):
                pass
    2 局部使用
        authentication_classes=[MyAuth,MyAuth2]
    3 全局使用
        查找顺序:自定义的APIView里找---》项目settings里找---》内置默认的
        REST_FRAMEWORK={
            ‘DEFAULT_AUTHENTICATION_CLASSES‘:[‘utils.common.MyAuth‘,]

        }

权限组件格式:

1 写一个类
        class MyPermission():
            def has_permission(self,request,view):
                token=request.query_params.get(‘token‘)
                ret=models.UserToken.objects.filter(token=token).first()
                if ret.user.type==2:
                # 超级用户可以访问
                    return True
                else:
                    return False
    2 局部使用:
        permission_classes=[MyPermission,]
    3 全局使用:
            REST_FRAMEWORK={
            ‘DEFAULT_PERMISSION_CLASSES‘:[‘utils.common.MyPermission‘,]
        }

频率组件格式:

1 写一个类:
        from rest_framework.throttling import SimpleRateThrottle
        class VisitThrottle(SimpleRateThrottle):
            scope = ‘xxx‘
            def get_cache_key(self, request, view):
                return self.get_ident(request)
    2 在setting里配置:
            ‘DEFAULT_THROTTLE_RATES‘:{
                ‘xxx‘:‘5/h‘,
            }
    3 局部使用
        throttle_classes=[VisitThrottle,]
    4 全局使用
        REST_FRAMEWORK={
            ‘DEFAULT_THROTTLE_CLASSES‘:[‘utils.common.MyPermission‘,]
        }

实例

实例简介:

只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件

1.mode层

class UserInfo(models.Model):
    name=models.CharField(max_length=32)
    pwd=models.CharField(max_length=32)
    ss=((1,‘超级用户‘),(2,‘普通用户‘),(3,‘二逼用户‘))
    type=models.IntegerField(choices=ss,null=True)

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

2.views层

from django.shortcuts import render,HttpResponse

# Create your views here.

import json
from rest_framework.views import APIView
from app01 import models
from utils.common import *
from rest_framework.response import Response

#登录类
class Login(APIView):
    def post(self,request,*args,**kwargs):

        #实例化响应状态函数(添加登录成功后的状态信息)
        response=MyResponse()

        #判断用户名、密码是否正确
        name=request.data.get(‘name‘)
        pwd=request.data.get(‘pwd‘)
        user=models.UserInfo.objects.filter(name=name,pwd=pwd).first()

        #如果登录成功生成一个随机字符串
        if user:
            #生成一个随机字符串
            token=get_token(name)
            #token表里面的信息,如果不存在,会创建,如果存在会更新token值(因为进行了随机时间加盐),使用的是update_or_create
            ret=models.UserToken.objects.update_or_create(user=user,defaults={‘token‘:token})
            # ret=models.UserInfo.objects.update_or_create(id=1,defaults={‘token‘:token}) 不是只能写user或者可以写id

            response.status=100
            response.msg=‘登录成功‘
            response.token=token
            print(response.get_dic())
        else:
            response.msg="用户名密码错误"
            # response.data=‘ddd‘  最后response.get_dic(),都可以把这些信息返回

        #里面需要传入个字典
        return Response(response.get_dic())

#查看课程类
class Course(APIView):
    #局部登录认证
    authentication_classes = [MyAuth,]
    #局部权限认证
    permission_classes = [Mypermission,]
    #局部频率认证
    throttle_classes = [VisitThrottle,]
    def get(self,request):
        print(request.user)
        print(request.auth)
        return HttpResponse(json.dumps({‘name‘:‘python‘}))

2.新建认证类

from rest_framework.exceptions import APIException,AuthenticationFailed
class MyAuth(BaseAuthentication):
    def authenticate(self, request):
        #拿到的是随机token的值
        token = request.query_params.get(‘token‘)
        ret = models.UserToken.objects.filter(token=token).first()
        if ret:
            #认证通过
            return ret.user,ret
        else:
            #认证失败
            raise AuthenticationFailed(‘认证失败‘)

原文地址:https://www.cnblogs.com/yangzhizong/p/9833245.html

时间: 2024-07-31 16:08:34

RESTful-rest_framework认证组件、权限组件、频率组件-第五篇的相关文章

认证、权限、频率、自定义签发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

Restful安全认证及权限的解决方案

一.Restful安全认证常用方式 1.Session+Cookie 传统的Web认证方式.需要解决会话共享及跨域请求的问题. 2.JWT JSON Web Token. 3.OAuth 支持两方和三方认证,是目前使用比较广泛的安全认证方式,但对于不使用第三方登录的认证的方式不太适用. 二.JWT简介 JWT由三部分组成,包括Header.Payload和Signature. JSON Web Token example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

认证、权限、视图组件

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方法之前是各种

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

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

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

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

认证 权限 视图 频率

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