目录

一 什么是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 Response class 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 admin from app01 import views urlpatterns = [
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方法,返回数据

Django Rest framework实现流程的更多相关文章

  1. Django Rest framework序列化流程

    目录 一 什么是序列化 二 Django REST framework配置流程之Serializer 三 Django REST framework配置流程之ModelSerializer 一 什么是 ...

  2. Django Rest Framework 请求流程

    用户请求到django,首先经过wsgi,中间件,然后到url路由系统,执行视图类中继承APIView执行as_view方法,在源码中可以看到VPIView继承了django的View类,通过supe ...

  3. 利用 Django REST framework 编写 RESTful API

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

  4. Django Rest framework 框架之认证使用和源码执行流程

    用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...

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

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

  6. Django rest framework源码分析(4)----版本

    版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models class UserInfo(models.Mo ...

  7. Django REST framework+Vue 打造生鲜超市(一)

    一.项目介绍 1.1.掌握的技术 Vue + Django Rest Framework 前后端分离技术 彻底玩转restful api 开发流程 Django Rest Framework 的功能实 ...

  8. Django rest framework(5)----解析器

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  9. Django rest framework源码分析(1)----认证

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

随机推荐

  1. weui 导航悬浮固定

    <style> .none{display: none} #toolbar { display: flex; justify-content: center; align-items: c ...

  2. Spring cloud微服务安全实战-5-2前端页面改造

    创建一个新的maveb项目,做一个admin的管理界面 用angular写前面的页面. 先吧dependcency引用引进来. 前端的插件能帮我在springboot里面搭建出一个nodeJS的环境来 ...

  3. 毫无PS痕迹 你的第一本Photoshop书 完整版

    毫无PS痕迹 你的第一本Photoshop书 目录 <毫无PS痕迹-你的本Photoshop书>全书分为四大部分: 第1.2章讲解色彩和图像的原理与基础知识要点. 第3至11章全面讲解了使 ...

  4. 利用SynchronizationContext.Current在线程间同步上下文(转)

    https://blog.csdn.net/iloli/article/details/16859605 简而言之就是允许一个线程和另外一个线程进行通讯,SynchronizationContext在 ...

  5. (十)进度条媒体对象和 Well 组件

    一.Well 组件 有 lg 和 sm 两种可选值 <div class="well well-lg"> Bootstrap </div> 二.进度条组件 ...

  6. div定位relative和absolute测试1

    div里的position定位也是比较常见的,relative是相对定位,absolute是绝对定位.如本文测试:body自带8px的margin,这里不对其进行清空.蓝色的div和红色的div分别设 ...

  7. keepalived通过飘移ip实现高可用配置步骤

    环境:两台虚拟机即可 centos7.3虚拟机A 10.0.3.46 centos7.3虚拟机B 10.0.3.110 对外开放的虚拟ip 10.0.3.96(这个ip只需要在keepalived里面 ...

  8. Flutter 路由传入中文参数报错无法push问题

    flutter自带路由传递参数和使用第三方库fluro路由传递参数都可以通过一下方式解决问题 String jsonString = json.encode(mapValue); var jsons ...

  9. CF1228D Complete Tripartite

    思路: 任选一点a,和a没有边直接相连的点一定和a在同一个集合,由此构造得到一个集合A.用类似的方法再构造一个集合B,并将剩下的点放在集合C中,就得到了三个集合A,B,C.再检查A,B,C是否符合要求 ...

  10. 【计算机视觉】基于Shading Model(对光照变化一定不变性)的运动目标检测算法

    光照模型(Shading Model)在很多论文中得到了广泛的应用,如robust and illumination invariant change detection based on linea ...