zoukankan      html  css  js  c++  java
  • Django REST framework使用及源码分析之验证

    REST framework模块

    【验证】

    使用方法:

    django的视图需要时CBV格式。

    class MyAuthentication(object):
        def authenticate(self,request):
            token = request._request.GET.get('token')
            if not token:
                raise exceptions.AuthenticationFailed('用户认证失败')
            return ('alex',None)
        def authenticate_header(self,val):
            pass
        
    class DogView(APIView):
        authentication_classes = [MyAuthentication,] #源码中会将列表中的元素循环并类实例化,然后通过封装request,这个列表会在request中
        
        def get(self,request):
            return HttpResponse('get')
    

    上面代码就是django rest framework的认证。

    写一个类,类里必须有authenticate方法,方法内写认证代码,失败则报错。
    然后将这个类写到视图的cbv当中。
    全局验证的配置文件书写方式:
     
    settings配置文件:
    REST_FRAMEWORK = {
        "DEFAULT_AUTHENTICATION_CLASSES":['api.utils.auth.FirstAuthtication','api.utils.auth.Authtication' ],
       #"UNAUTHENTICATED_USER":lambda : "匿名用户",
        "UNAUTHENTICATED_USER":None,
        "UNAUTHENTICATED_TOKEN":None"
    }
    

     如上,列表中写了两个验证类的对象,这种全局配置不能再将验证类写到view.py中,需要单独创建一个配置文件,然后将类的路径写到settings中,如果在全局的情况下某个视图不想用认证(比如登陆),只需在视图类中添加

    authentication_classes=[]
    因为如果本地这个类存在就不会去向父类找,这个列表是个空,则不需认证。
    UNAUTHENTICATED_USER这个就是设置匿名用户名称。需要是个可执行函数。也可以写为None
    总结:
    内置的认证类:
    可以使用这些内置的验证类实现不同的验证方式。
    BaseAuthentication
    BasicAuthentication   
    SessionAuthentication
    TokenAuthentication
    RemoteUserAuthentication
     
    BaseAuthentication:
    总结:
    没有实现具体功能,只是有两个认证方法:
    def authenticate(self,request)
        pass
    def authenticate_header(self,request)
    ''' 该函数是当认证失败的时候给浏览器的响应头'''
        pass
     
    建议自己写认证类的时候继承BaseAuthentication
    然后重写它的方法。
     
    from rest_framework.authentication import BaseAuthentication
    
    继承并实现这两个方法,header这个方法一般不用,写成空的即可。
    authenticate方法三种返回值:
        None,下一个认证继续执行。
        raise exceptions.AuthenticationFailed("失败")
        (元素1,元素2) 元素1 request.user  元素2 request.auth
    源码流程:
    dispatch
        封装request
            获取定义的认证类(全局/局部),通过列表生成式创建对象
        initial
            perform_authentication
                request.user(内部循环。。。)
     
    BasicAuthentication
    该配置很少用,通过浏览器自动生成账号密码加密
    效果和路由器登陆的那个相似。

    源码逻辑分析:

    源码运行流程:
    首先CBV继承APIView,通过as_View()先来到dispatch
    先initialize_request封装request,封装的时候回先执行get_authenticators,
    将原生request和自定义验证类的列表封装进去(实际上封装多个,具体见下图)。
    get_authenticators里面通过列表生成式循环authentication_classes列表,并实例化里面的类,
    也就是说列表里都是验证类的对象。
    authentication_classes在父类里的定义是rest framework的配置文件,DEFAULT_AUTHENTICATION_CLASSES
     
     initial里request执行user方法
     

    user方法通过porperty可以用点来调用,

    循环authenticatior对象,就是那个列表,每个元素(对象)执行一次验证方法,一般不加多个验证。
     

    具体的验证方法,一共三种返回值类型:

      01有返回值,必须是元组(request.user,request.auth)  

      02验证失败抛出异常,然后执行self._not_authenticated

      

      03返回None,当前认证不处理交给下一个认证处理。如果所有验证都没有返回值,执行self._not_authenticated 

    django提供默认匿名用户的request.user和request.auth

     

    下面为匿名用户函数具体代码

    验证成功执行具体的视图函数方法。

  • 相关阅读:
    PS后期合成,你和大神的差距就这5步!
    欧几里得算法:从证明等式gcd(m, n) = gcd(n, m mod n)对每一对正整数m, n都成立说开去
    谜题:过桥问题
    《世界是数字的》读书笔记第一部分_硬件篇
    完全偶图K(3,3)与完全图K5是否存在平面表示
    Dijkstar算法的数学原理
    LeetCode 141. Linked List Cycle
    LeetCode 155. Min Stack
    LeetCode 160. Intersection of Two Linked Lists
    LeetCode 165.Compare Version Numbers
  • 原文地址:https://www.cnblogs.com/ArmoredTitan/p/8799129.html
Copyright © 2011-2022 走看看