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
下面为匿名用户函数具体代码
验证成功执行具体的视图函数方法。