目录

一 什么是restful架构
二 Django REST framework简介
三 Django REST framework原理
四 Django REST framework源码流程
五 Django REST framework实现用户登录

一 什么是restful架构

1、起源

REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。
目前在三种主流的Web服务实现方案中,因为REST模式的Web服务与复杂的SOAP和XML-RPC对比来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务进行图书查找;雅虎提供的Web服务也是REST风格的

2、框架组成

根据rest的论文,我们大致可以把restful架构分成以下几个部分

1. 资源

资源就是网络中的具体信息。比如说招聘信息、美女图片、NBA赛事、股票信息、歌曲等等。每一种具体资源都可以用一个URI(统一资源定位符)指向它。如果想要获取这些资源,则直接访问它的URI就可以。
有很多公共的URI,例如阿里云的api市场就提供了很多种的api,每种api代替了具体的资源,每种资源你都可以通过访问api获取到。
例如访问下面图片中的api地址,就可以获取到沪深港股票历史行情数据

2. 表现方式

在资源里我们提到了阿里云提供了很多api,api获取了是一些静态资源,而表现方式就会为了处理获取到的这些资源以什么样的形式展示给访问者。
现在常用的方式有比如,txt格式、HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。
从上图可以看到,api的表现形式(也就是返回数据格式)为json格式。

3. 状态

状态定义了做资源的操作方式。这些操作方式全部定义在http协议里面,而不再api上表现。客户端通过四个HTTP动词,对服务器端资源进行操作
具体操作:

  • GET(SELECT):从服务器取出资源(一项或多项)。
  • POST(CREATE):在服务器新建一个资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。
  • PATCH(UPDATE):在服务器更新资源(客户端提供需要修改的资源数据)。
  • DELETE(DELETE):从服务器删除资源。

3、认证机制

我们知道,客户端通过api可以访问到资源,但我们还需要对访问者进行验证,以用来判断该用户的访问权限。
常用的认证机制包括 session auth(即通过用户名密码登录),basic auth,token auth和OAuth,服务开发中常用的认证机制为后三者。
这里主要介绍一下OAuth。

1. OAuth介绍

OAuth(开放授权)是一个开放的授权标准,允许用户让第三方应用访问该用户在某一web服务上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的第三方系统(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。

正是由于OAUTH的严谨性和安全性,现在OAUTH已成为RESTful架构风格中最常用的认证机制,和RESTful架构风格一起,成为企业级服务的标配。
目前OAuth已经从OAuth1.0发展到OAuth2.0,但这二者并非平滑过渡升级,OAuth2.0在保证安全性的前提下大大减少了客户端开发的复杂性。

二 Django REST framework简介

Django REST framework是一个基于Django实现的一个restful框架,一个十分强大切灵活的工具包,用以构建Web APIs。
Djando REST framework的优点:

  • 在线可视的API
  • 验证策略涵盖了OAuth1和OAuth2
  • 同时支持ORM和非ORM数据源的序列化
  • 支持基于类的视图

安装与部署环境

使用pip安装框架以及所有依赖包

pip install djangorestframework
pip install markdown  # 可以更好的支持可浏览的API
pip install django-filter  # 支持过滤

还可以使用clone安装
git clone git@github.com:encode/django-rest-framework.git
安装完之后需要在项目的配置文件的app里面注册rest_framework,因为有些地方会用到rest_framework这个app里面的数据,例如返回数据的模板

INSTALLED_APPS= (...'rest_framework',)

三 Django REST framework简单流程

首先我们看一个通过Django REST framework实现的一个api的简单实例

# views.py 首先写视图函数
from rest_framework.views import APIView
from rest_framework.response import Responseclass TestView(APIView):  # CBV模式的视图函数def get(self, request, *args, **kwargs):# 定义get方法# 在django-rest-framework中的request被重新封装了,后续分析源码的时候会有具体体现return Response('测试api')  # rest-framework的模板对数据进行渲染# urls.py 定义路由
from django.conf.urls import url
from django.contrib import adminfrom app01 import viewsurlpatterns = [url(r'^user/', views.TestView.as_view())
]

启动项目,访问api:

原理分析:

  1. rest_framework重写了一个APIView的类,这个类是之前django中的view类的派生类,在写CBV的视图函数是,让视图函数继承了rest-framework这个APIView类
  2. 在视图函数中写具体方法,例如get,port,put,delete,可以使用rest_framework的Response对返回数据进行渲染
  3. 在url的写法和Django是一样的
  4. 通过对http://127.0.0.1:8000/user/ 的访问,可以得到如图显示的数据

四 Django REST framework源码流程

在第三节我们分析了一个简单的api实现过程,现在我们主要去分析rest_framework内部对这个url的具体实现过程。

  1. 首先我们访问http://127.0.0.1:8000/user/ 根据urls.py中的配置,执行views.TestView.as_view()函数
  2. as_view方法是被定义在rest_framework/views.py里面的一个静态方法,所以可以通过类名直接调用。

  3. 父类的as_view方法是定义在django/views/generic/base.py里面的View类中的方法。在这个方法中最终会执行cls.dispatch,在第一步中我们知道cls是<class 'app01.views.TestView'>

  4. dispatch是定义在TestView继承的父类APIView(rest_framework/views.py)里面的方法。在这个方法里面,首先通过 request = self.initialize_request(request, *args, **kwargs)这条语句重新封装了request对象

  5. initialize_request是APIView类里面的一个方法,重新封装了request对象,增加了一些属性信息

  6. 认证信息。主要通过APIView类中的get_authenticators(rest_framework/views.py)方法获取,这个方法会返回一个所有认证对象的列表
    在全局定义的authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES

  7. 默认的认证配置信息是在rest_framework/settings.py文件中定义的

  8. 在rest_framework/authentication.py中定义了几种认证类型,一般情况我们需要自定义认证类,也可以使用django-oauth-toolkit组件进行认证。

  9. dispatch中的initialize_request方法执行完成之后,还有执行一个重要方法是self.initial(request, *args, **kwargs),这个方法也是APIView类里的。在这个方法里面初始化
    被重新封装的request对象
    实现功能:

    • 版本处理
    • 用户认证
    • 权限
    • 访问频率限制

  10. 执行APIView里面的perform_authentication方法,该方法返回request.user,则会调用<rest_framework.request.Request object at 0x10e80deb8>里面的user方法。在user方法里面最终调用了Request类里面的_authenticate方法


  11. 执行rest_framework.request.Request类中的_authenticate方法,这个方法会遍历认证类,并根据认证结果给self.user, self.auth赋值。由于user,和auth都有property属性,
    所以给赋值的时候先在先执行setter方法


  12. dispatch中的initial方法执行完之后,会继续判断request.method并执行method相应的method.

  13. 执行TestView中定义的get方法,返回数据

转载于:https://www.cnblogs.com/eric_yi/p/8422373.html

Django Rest framework实现流程相关推荐

  1. Django Rest framework的限流实现流程

    目录 一 什么是throttle 二 Django REST framework是如何实现throttle的 三 Django REST framework中throttle源码流程 一 什么是thr ...

  2. Django REST framework 简介

    1.在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的. 2.在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增.删.改. ...

  3. Django REST framework 1

    Django REST framework Django REST framework官方文档:点击  中文文档:点击 安装djangorestframework:pip3 install djang ...

  4. Django REST framework的各种技巧——1.基础讲解

    写在最上面的话 django是一个神奇的框架,而restframework又是遵循了这个框架的另一个神奇的框架,然而由于restframework的文档稀烂无比,很多时候你必须看源码才能写出科学的代码 ...

  5. 源码剖析Django REST framework的认证方式及自定义认证

    源码剖析Django REST framework的认证方式 由Django的CBV模式流程,可以知道在url匹配完成后,会执行自定义的类中的as_view方法. 如果自定义的类中没有定义as_vie ...

  6. Django Rest Framework源码剖析(二)-----权限

    一.简介 在上一篇博客中已经介绍了django rest framework 对于认证的源码流程,以及实现过程,当用户经过认证之后下一步就是涉及到权限的问题.比如订单的业务只能VIP才能查看,所以这时 ...

  7. DRF (Django REST framework) 框架介绍

    Web应用模式 在开发Web应用中,有两种应用模式: 前后端不分离 前后端分离 1 前后端不分离 在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控 ...

  8. Django Rest Framework(一)

    一.什么是RESTful REST与技术无关,代表一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移". R ...

  9. Django REST framework API开发

    REST 介绍 RESTful API 设计 实现API的两种方式 FBV 视图函数 urlpatterns = [url(r'^user/$', views.user),url(r'^user/ad ...

  10. [转]Django REST framework 简介与中文教程

    Django REST framework 简介与中文教程 简介 在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的. 在开发REST AP ...

最新文章

  1. java static 变量共享_java中如何理解多个对象共享同一个静态成员变量?
  2. Pycharm无法安装第三方模块(模块已存在/换源)
  3. 线程池的种类,区别和使用场景
  4. maven运行tomcat6出现错误Exception starting filter encodingFilter怎么解决
  5. qt 获取发送信号的对象
  6. [大牛就是牛]双栈排序
  7. javascript:URL编解码和父子窗口交互
  8. python操作数据库慢_MySQL数据库之python 拉取mysql 慢日志
  9. [转载]INNO Setup 使用笔记
  10. 2038年问题 php,php strtotime() mktime() 的2038年问题 Y2K38漏洞
  11. malloc.h头文件以及malloc函数
  12. 华为计算机网络基础知识,华为HCNE专题一:网络基础知识
  13. python substr_Python字符串的方法
  14. 辛弃疾最经典的10首词
  15. Git内部原理之深入解析环境变量
  16. pip安装tensorflow报错:could not find a version that satisfies the requirement grpcio=1.8.6
  17. 世界上首先实现存储的电子数字计算机,世界上首先实现存储程序的电子数字计算机是ENIAC。...
  18. springcloud(瞿永超著)学习记录(更新中)
  19. MySQL自动化安装部署(数据库参数可自适应 DBA 推荐)
  20. 360收藏夹html文件,360浏览器收藏夹在哪个文件夹

热门文章

  1. 书籍-Docker 容器与容器云
  2. 火狐浏览器_全球知名度非常高的火狐浏览器,它好在哪呢?
  3. (2)、PHP Win10 本地配置RabbitMq
  4. PHP中cURL的curl_getinfo函数返回的CURLINFO_HTTP_CODE是0
  5. [R语言绘图]直方图hist
  6. C++中,类如果包含map/list等对象,慎用memset(0)
  7. 百度人脸识别:即使不用,也要import,否则C调用Python会崩溃
  8. 关于手机联系人的改进想法
  9. 干电池很不经用,比充电电池差多了
  10. 从进化的角度看为啥要均贫富