Fork me on GitHub

RESTful api 与 Django的 restfulframework

RESTful api 与 Django的 restfulframework



1 restful api 的基本概念


一类的资源使用一个url,不同的操作通过 请求方式处理


api -- >> 就是一个url

两个用途:

    为别人提供服务(发送邮件或者是发短信, 运营商提供接口, 客户通过api提交数据)

    前后端分离
        越来越火(原来是后端通过模板引擎实现)

restful(资源状态转移--它一种约定)

-- >> 对互联网上任意东西(url) 都视为资源 -- 面向资源编程

Re
资源(***) --- 每一个url,代表资源,网络上的具体信息

S(State)
表现层 ----  客户端与服务器之间,传递这种资源的某种表现层

T(Transfer)
状态转换   ----  POST/GET/PUT/DELETE  对服务器资源进行操作,实现转换

restful api是 实现 前后端分离的最佳实践

请求一个url的方式遵循:
    GET
    POST
    PUT
    DELETE

1 轻量,直接通过http,不需要额外的协议,post/get/delete

2 面向资源,一目了然,具有自解释性

3 数据描述简单,一般是 json,或者 xml 进行数据通信


前后端分离的优点与缺点

优点

pc,app,pad 多端适应
SPA (single page) 开始流行
前后端开发 职责不分(解决template 由谁来写的问题)
提高开发效率,前后不用再互相等待
降低模板语言耦合性

(不再用模板语言)

缺点

前后端学习 门槛增加
文档(后端给前端--文档)
前端工作量增加
SEO
后端开发去、模式迁移增加成本

2 restful api 设计规范:


协议
API与用户的通信协议,总是使用HTTPs协议。

域名 
https://api.example.com                         尽量将API部署在专用域名(会存在跨域问题)
https://example.org/api/                        API很简单

版本
URL,如:https://api.example.com/v1/

请求头
跨域时,引发发送多次请求

路径,视网络上任何东西都是资源,均使用名词表示(可复数)
https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees

method

GET      :从服务器取出资源(一项或多项)
POST    :在服务器新建一个资源
PUT      :在服务器更新资源(客户端提供改变后的完整资源)
PATCH  :在服务器更新资源(客户端提供改变的属性)
DELETE :从服务器删除资源

过滤,通过在url上传参的形式传递搜索条件

https://api.example.com/v1/zoos?limit=10:指定返回记录的数量
https://api.example.com/v1/zoos?offset=10:指定返回记录的开始位置
https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数
https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件

状态码


错误处理,状态码是4xx时,应返回错误信息,error当做key。

{
    error: "Invalid API key"
}

返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。

GET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
PATCH /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档

Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。

{"link": {
  "rel":   "collection https://www.example.com/zoos",
  "href":  "https://api.example.com/zoos",
  "title": "List of zoos",
  "type":  "application/vnd.yourformat+json"
}}
  摘自:http://www.ruanyifeng.com/blog/2014/05/restful_api.html 

REST 的设计原则

	统一接口  Uniform interface

	无状态  Stateless

	可缓存  Cacheable

	服务端 客户端分离  Client-Server

	分层系统  Layered System

	按需编码  Code on command

3 CBV 模型:


基于类视图与基于函数的视图

django的 cbv(class base view) 和 fbv(function base view)

cbv 是django 官方推荐的方式, 代码重用性好

功能实现方法

    通过dispatch 方法 ,反射 request中 method 的 对应值,获得相应的方法
    路由
        CView.as_view()  == >> 返回 view 函数   | 调用dispatch(返回相应的response对象)

        CBV ----  基于反射实现  根据不同的请求方式 执行不同的方法

在请求前后 加上一段功能,多个类继承 基类

class MyBaseView(object):
    def dispatch(self, request, *args, **kwargs):
        print('before')
        ret = super(MyBaseView,self).dispatch(request, *args, **kwargs)
        print('after')
        return ret


class LoginView(MyBaseView,APIView):

    def get(self,request,*args,**kwargs):

        ret = {
            'code':1000,
            'data':'老sdas'
        }
        response = JsonResponse(ret)
        return response

4 Django Restful framework:


基于 django 开发 的用于 RESTful api 接口的 框架;


(1)安装:

依赖 django

 (1)pip install djangorestframework

	 需要安装django -- 可以使用豆瓣镜像 加速
	 pip install -i https://pypi.douban.com/simple/ django 

  (2)pip install markdown django-filter
  		两个包一起安装

(2) DRF中的 request 与 django的 request的区别

DRF 的 request 对 django 的 request 进行了更一步的封装

(1)通过 dispatch 添加 内容
       parser
       autheticators  # 获取认证相关的所有类,并实例化,传入request对象(user,auth)
       negotator
       parse_context
                    
        可以把认证类,写在配置文件中 --- 全局配置

        也可以视图中 定义 --- 视图配置
			authentication_classes =[] 来取消认证     

        REST_FRAMEWORK = {
            'UNAUTHENTICATED_USER':None,
            'UNAUTHENTICATED_TOKEN':None,
            'DEFAULT_AUTHENTICATION_CLASSES':[
                'goods.utils.MyAuthentication'
            ]
        }

(2)执行 initialize 方法

        处理版本
        认证 auth
        权限 permission
        访问频率限制 throttle

(3) 通过 反射  执行相应的 方法

(4)response 加工 ,返回结果
posted @ 2018-03-01 19:55  派对动物  阅读(375)  评论(0编辑  收藏  举报
Top