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

     

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

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

  • 相关阅读:
    Effective Java 第三版——26. 不要使用原始类型
    Effective Java 第三版——25. 将源文件限制为单个顶级类
    Effective Java 第三版——24. 优先考虑静态成员类
    Effective Java 第三版——23. 优先使用类层次而不是标签类
    Effective Java 第三版——22. 接口仅用来定义类型
    Effective Java 第三版——21. 为后代设计接口
    Effective Java 第三版——20. 接口优于抽象类
    Effective Java 第三版——19. 如果使用继承则设计,并文档说明,否则不该使用
    Effective Java 第三版——18. 组合优于继承
    Effective Java 第三版——17. 最小化可变性
  • 原文地址:https://www.cnblogs.com/ArmoredTitan/p/8799129.html
Copyright © 2011-2022 走看看