rest_framework源码分析:

1.as_view()

2.父类的as_view() view = super(APIView, cls).as_view(**initkwargs)

3.view 方法中 return self.dispatch(request, *args, **kwargs)

4.dispatch

1.将原来的request进行分装成restframework

request = self.initialize_request(request, *args, **kwargs)

self.request = request

2.处理版本,认证,权限,访问频率

self.initial(request, *args, **kwargs)

1.处理版本信息

version, scheme = self.determine_version(request, *args, **kwargs),request.version, request.versioning_scheme = version, scheme

if self.versioning_class is None:return (None, None)没有版本控制类,不做版本控制

scheme = self.versioning_class()#如果有走版本控制类

return (scheme.determine_version(request, *args, **kwargs), scheme)

version = kwargs.get(self.version_param, self.default_version) 获取版本

if not self.is_allowed_version(version): 如果版本不存在或者不在允许范围内

2.处理认证信息

self.perform_authentication(request)

request.uer 进入带有装饰器@Propryty 下的uer方法

if not hasattr(self, '_user'): #判断是否没有认证

self._authenticate() #没有认证,进入_authenticate()认证

for authenticator in self.authenticators: #循环获取认证对象

authenticators=self.get_authenticators() #将认证对象封装到 authenticators

return [auth() for auth in self.authentication_classes] #列表循环实例化authentication_classes列表的类的对象

authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES #默认使用setting的配置

#认证过了直接返回

return self._user

3.处理权限信息

self.check_permissions(request)

for permission in self.get_permissions():   从permission_classes中/获取权限类,在执行对象的列表生成式

if not permission.has_permission(request, self): 执行每一个类的has_permission进行权限认证

permission_denied(self, request, message=None) #如果权限认证失败执行

def permission_denied(self, request, message=None):

"""

If request is not permitted, determine what kind of exception to raise.

"""

if request.authenticators and not request.successful_authenticator:

raise exceptions.NotAuthenticated('无权访问')

raise exceptions.PermissionDenied(detail=message)

4.处理访问频率限制

self.check_throttles(request)

for throttle in self.get_throttles(): 从throttle_classes=[MyThrottle,] 循环获取节流对象

if not throttle.allow_request(request, self):  执行对象的allow_request(request, self)方法,成功返回True

self.throttled(request, throttle.wait()) 访问频率限制执行throttled(request, throttle.wait())

def throttled(self,request,wait): 在APIView中

class InnerThrottled(exceptions.Throttled):

default_detail = '请求被限制.'

extra_detail_singular = 'Expected available in {wait} second.'

extra_detail_plural = '还需要再等待{wait}秒'

raise InnerThrottled(wait)

throttle.wait() 返回,剩余多少时间可以进行再访问

在自定制的频率限制类中实现:

def wait(self):父类已经实现

3.根据用户提交的方法反射请求方法

handler = getattr(self, request.method.lower(),)

4.将处理后的数据进行,序列化,路由,渲染等方式进行封装

self.response = self.finalize_response(request, response, *args, **kwargs)

Django Rest Framework threoy的更多相关文章

  1. 使用django rest framework

    django 刚接触,想做一些restful api , google了一下,发现有现成的框架.Django REST framework. 对使用做下记录: 安装 从http://django-re ...

  2. 利用 Django REST framework 编写 RESTful API

    利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framewor ...

  3. django rest framework 入门

    django rest framework 入门1-序列化 Serialization 分类: Python 2013-01-22 22:24 11528人阅读 评论(0) 收藏 举报 djangop ...

  4. django rest framework

    Django-Rest-Framework 教程: 4. 验证和权限 作者: Desmond Chen, 发布日期: 2014-06-01, 修改日期: 2014-06-02 到目前为止, 我们的AP ...

  5. django rest framework csrf failed csrf token missing or incorrect

    django rest framework csrf failed csrf token missing or incorrect REST_FRAMEWORK = { 'DEFAULT_AUTHEN ...

  6. Django REST Framework学习——Android使用REST方法访问Diango

    本文更应该叫做Android如何模拟浏览器访问Django服务器后台. 环境为: Android通过HttpClient访问服务器,从Django中获取json数据,解析显示在UI界面上. 问题为: ...

  7. 用Django Rest Framework和AngularJS开始你的项目

    Reference: http://blog.csdn.net/seele52/article/details/14105445 译序:虽然本文号称是"hello world式的教程&quo ...

  8. Django REST framework使用ViewSets的自定义路由实现过程

    在Django中使用基于类的视图(ClassView),类中所定义的方法名称与Http的请求方法相对应,才能基于路由将请求分发(dispatch)到ClassView中的方法进行处理,而Django ...

  9. Django REST FrameWork中文教程2:请求和响应

    从这一点开始,我们将真正开始覆盖REST框架的核心.我们来介绍几个基本的构建块. 请求对象REST框架引入了Request扩展常规的对象HttpRequest,并提供更灵活的请求解析.Request对 ...

随机推荐

  1. jQuerychicun

    jQuery 尺寸 方法 jQuery 提供多个处理尺寸的重要方法: width() height() innerWidth() innerHeight() outerWidth() outerHei ...

  2. SpringMVC项目的快速搭建

    Spring MVC提供了一个DispatcherServlet来开发Web应用.在Servlet2.5及2以下的时候只要在web.xml下配置<servlet>元素即可. 在Servle ...

  3. 使用startForeground让android服务前台运行

    最近在使用android 4.1系统的时候,发现在手机休眠一段时间后(1-2小时),后台运行的服务被强行kill掉,有可能是系统回收内存的一种机制,要想避免这种情况可以通过startForegroun ...

  4. Nodejs入门边读边想边记(-)

    Node入门>>一本全面的Node.js教程网站地址:http://www.nodebeginner.org/index-zh-cn.html 本文记录我在阅读上面这个网站的过程中得到的一 ...

  5. windows10下git报错warning: LF will be replaced by CRLF in readme.txt. The file will have its original line endings in your working directory.

    window10下使用git时 报错如下: $ git add readme.txtwarning: LF will be replaced by CRLF in readme.txt.The fil ...

  6. nginx 升级为最新版 nginx -1.12.0

    标签:nginx 公司目前使用的nginx版本比较低(nginx-1.0.12),请网络安全公司做了一下“远程安全评估”,发现有下列漏洞: nginx URI处理安全限制绕过漏洞(CVE-2013-4 ...

  7. 详细讲解:yii 添加外置参数 高级版本

    在YII中,添加状态参数的形式 首先,我们在advanced\common\config\params.php文件中,添加我们要设置的参数: 要在控制器中进行使用的话,形式为:\Yii::$app-& ...

  8. HDU汉诺塔系列

    这几天刷了杭电的汉诺塔一套,来写写题解. HDU1207 汉诺塔II HDU1995 汉诺塔V HDU1996 汉诺塔VI HDU1997 汉诺塔VII HDU2064 汉诺塔III HDU2077  ...

  9. Python开发第四篇

    文件操作 一.文件基本操作 打开文件方法:open f = open("test",encoding="") r:只读模式(只能读取文件,不能做写操作,文件不存 ...

  10. js 中//<![CDATA[ 意义

    CDATA内部所有东西都会被解析器忽略,加入文本中包含了大量< 和 $符号,就像编程中经常出现的情况一样,那么这个元素就可以被定义为一个CDATA部分 ,CDATA 区段开始于 "&l ...