码迷,mamicode.com
首页 > 其他好文 > 详细

Django REST framework使用及源码分析之验证

时间:2018-04-11 23:06:44      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:先来   自己   密码加密   ati   ESS   总结   获取   self   对象   

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

 技术分享图片

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

技术分享图片

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

Django REST framework使用及源码分析之验证

标签:先来   自己   密码加密   ati   ESS   总结   获取   self   对象   

原文地址:https://www.cnblogs.com/ArmoredTitan/p/8799129.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!