Django Rest framework实现流程

目录

一 什么是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方法,返回数据

posted @ 2018-02-06 14:53  eric_yi  阅读(3992)  评论(3编辑  收藏  举报