在看源码之前先了解一下什么是rest,restful api.
什么是rest
可以总结为一句话:REST是所有Web应用都应该遵守的架构设计指导原则。 REST是Representational State Transfer的简称,中文翻译为“表征状态转移”.
restful api
符合REST架构设计的API。
restful api的书写规范:
- URL(在url中表现出来它是一个api)
- url名词(url应当是名词)
- 版本 (在url中表明版本号)
- 提交方式(提交方式最为重要,根据提交方式的不同来判断要执行什么样的操作)
- status(返回的状态码)
- Hypermedia link(在api中返回链接)
- 错误详细(状态码是4xx时,应返回错误信息,error当做key。)
下面就来看看它源码中的流程
UserInfo类:
from django.shortcuts import render,HttpResponse from rest_framework.views import APIView from rest_framework.exceptions import APIException class UserInfo(APIView): authentication_classes=[Myauthentication,] def get(self,request): return HttpResponse(".....")
首先,请求刚进来会执行对应类中的dispathch()方法,若当前类中没有,就去它的父类APIView中找。
第二步,它又调用了initialize_request并将它的返回值重新赋值给了request。说明现在的request就不是django原来的request了,然后我们点进去它里面都做了些什么。
在initialize_request方法中,又重新封装了request对象,在原来的基础上又重新封装了一些东西,现在我们来看看get_authenticators()中到底做了什么
在get_authenticators这个方法中循环了self.authentication_classes返回了一个列表对象,因为他是self.找的,所有它先去我们写的那个类中去找authentication_classes,我们
写的类中没有才去父类中找,因此我们就可以自定义这个列表类了。在定义之前要知道它默认的类中都有什么,我们才会好根据它默认的类去定义。
由此可以看出它默认的authentication_classes是从它的配置文件中读出来的。现在就可以去看看它配置文件中的类了。
现在就可以去看看这两个类中都有什么方法。
可以看出他们都继承了一个BaseAuthentication的类并且都实现了authenticate方法。所以现在我们去看看BaseAuthentication类到底是什么?
由此可以看出BaseAuthentication类其实是一个接口类,让继承它的类必须实现authenticate方法。
最后就是在request对象中的authenticatotes中封装了一些关于认证的对象,然后我们接着往下看 ,
然后又执行initial这个方法。
然后就在request.user中执行authenticate这个方法进行认证
这就是认证的大概流程,其它权限什么的都一样,就不一一说明了。