Django Rest framework 的流程大概是这样的

  1. 建立 Models
  2. 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示)
  3. ViewSet 是一个 views 的集合,根据客户端的请求(GET、POST等),返回 Serialiers 处理的数据
    • 权限 Premissions 也在这一步做处理
  4. ViewSet 可在 Routers 进行注册,注册后会显示在 Api Root 页上
  5. 在 urls 里注册 ViewSet 生成的 view,指定监听的 url

Serializers,这个相当于 Django 的 Form

其实 viewset 反而是最简单的部分,rest_framework 原生提供了四种 ViewSet

  • ViewSet
  • GenericViewSet
    • 继承于 GenericAPIView
  • ModelViewSet
    • 自身提供了六种方法
    • list
    • create
    • retrieve
    • update
    • partial_update
    • destroy
  • ReadOnlyModelViewSet
class DataBaseInfoViewSet(viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticated,)
queryset = DataBaseInfo.objects.all()
serializer_class = DataBaseInfoSerializer
filter_backends = (filters.DjangoFilterBackend,)
filter_fields = [
'id',
'db_name', ] def get_queryset(self):
queryset = self.queryset
queryset = queryset.prefetch_related('create_user')
return queryset

Filters

前面根据 serializers 和 viewset 我们已经可以很好的提供数据接口和展示了。但是有时候我们需要通过 url参数 来对数据进行一些排序或过滤的操作,为此,rest-framwork 提供了 filters 来满足这一需求。

全局filter

可以在 settings 里指定应用到全局的 filter:

REST_FRAMEWORK = {
   'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',)}

viewset 的 filter

也可以为 viewset 分别指定 filter,方法就是在定义 viewset 的时候定义一个名为 filter_backend 的类变量:

class UserListView(generics.ListAPIView):
   queryset = User.objects.all()
   serializer = UserSerializer
   filter_backends = (filters.DjangoFilterBackend,)

Premissions

顾名思义就是权限管理,用来给 ViewSet 设置权限,使用 premissions 可以方便的设置不同级别的权限:

  • 全局权限控制
  • ViewSet 的权限控制
  • Method 的权限
  • Object 的权限

被 premission 拦截的请求会有如下的返回结果:

  • 当用户已登录,但是被 premissions 限制,会返回 HTTP 403 Forbidden
  • 当用户未登录,被 premissions 限制会返回 HTTP 401 Unauthorized

默认的权限

rest_framework 中提供了七种权限

  • AllowAny # 无限制
  • IsAuthenticated # 登陆用户
  • IsAdminUser # Admin 用户
  • IsAuthenticatedOrReadOnly # 非登录用户只读
  • DjangoModelPermissions # 以下都是根据 Django 的 ModelPremissions
  • DjangoModelPermissionsOrAnonReadOnly
  • DjangoObjectPermissions

全局权限控制

在 settings.py 中可以设置全局默认权限

# settings.py

REST_FRAMEWORK = {
   'DEFAULT_PERMISSION_CLASSES': (
       'rest_framework.permissions.AllowAny',
   ),}

ViewSet 的权限

可以设置 permission_classes 的类属性来给 viewset 设定权限,restframework 会检查元组内的每一个 premission,必须要全部通过才行。

class UserViewSet(viewsets.ReadOnlyModelViewSet):
   queryset = User.objects.all()
   serializer_class = UserSerializer
   # 设置权限,是一个元组
   permission_classes = (permissions.IsAuthenticated,)

创建序列器

序列器的作用

在开始 我们的 Web API 之前,我们需要考虑 如何完成 snippet 实例   的序列化和反序列化。在restframework 里面 这个动作被分成了2部分

1.序列器: 用于完成 实例 和 python数据结构的  转换

2.使用python的json模块来完成 python数据结构 和 json 数据结构的 转换 (Django对其进行了封装,restframework已对其进行了封装,这个后面会说)

因此这个 序列器的作用就是用来完成  实例和python数据结构的 一个转换, 因此这个概念和 Django 的from很像。他的定义方式也和Django Form很像,

定义序列器

定义一个序列器 主要需要定义2部分:

1. 定义序列化/反序列化的字段

2.重写Serializer类的 create方法,和update方法,这2个方法必须重写,因为 Serializer类的save方法会 调用 create方法和 update 方法来创建和更新数据, 这样将 create方法 和 update 方法独立出来, 让用户自己实现, 使得 serialzer 在序列化时 具有 高度的灵活性。

在 snippets app 下 创建一个 serializers.py文件

使用序列器

序列器仅能帮我们把 python数据结构(OrderedDict)和 snippets对象 进行转换, 如果想 转化成json数据格式,可以使用json模块,这里使用restframework为我们封装好的 JSONRender  和 JSONParser 对象 来完成 Json数据  和 python 数据的转换。

序列化

1.完成snippet对象和python内部数据结构(OrderedDict)的转换

2.完成python数据结构(OrderedDict) 到 Json数据结构的转换

反序列化

1.完成Json数据结构 到Python内部数据结构(OrderedDict)的转换

2.获得的python内部结构的数据 转换成 snippet对象(由于我们定义了 create 和 update方法,所有转换成snippet对象后 ,会隐式的存入数据库)

如何序列化queryset对象

默认情况下 序列器 仅能序列化一个对象,而 queryset 是 多个表实例对象的 列表。 因此如果想要一次序列化多个对象, 也就是序列化queryset对象

Serializer 类提供了一个 布尔选项,只要开启这个布尔选项(many=True),那么就可以序列化 queryset对象了

使用Model  Serialser 优化 序列器

问题与优化

我们发现 序列器里面定义的字段, 基本都和 数据模型里面的 字段重复了, 为了保证代码的简洁,需要去重。

Django Form 提供 Form 和 ModleForm, 而restframework 也同时提供 Serializer 和 ModelSerializer

这里的ModleSerializer  就是使 序列器 的定义更简洁, 更优雅的一个类

注意,ModelSerializer 对于 Serializer 并没有做说明特别的 处理, 他的作用仅仅是我们建立序列器的一种 快捷方法,这里ModelSerializer帮我们做了2件事儿

1.根据Modle的字段 自动化设置序列器的字段类型

2.实现了默认的 create 方法, 和 update方法 (当然如果和我们的需求不想符, 你可以重写这些方法)

优化后的代码

修改snippets/serializers.py, 实现我们优化过后的 序列器定义方法

1
2
3
4
class SnippetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style')

 

Restframework 提供一种机制 来让 开发人员仅仅 专注于 模型和API交互 的开发, 这种机制就是 章要讲的 ViewSet 和 Router。

Viewset(集合视图)- 他将一组 相同资源的不同视图 ,集合成了一张视图, 而开人人员需要编写的是 对这个资源的处理方法(比如 read, update), 而不是实现http的处理方法(get, update)。因此 Viewset是一个抽象层, 他完成了  http方法  <—> 资源处理方法

Router(路由器)-  更具一种 共同的约定 自动处理url, 主要是url pattern的命名。


使用Router

Router功能简介

1. 分解viewset

Router会为我们完成view的分解, 但是分解是遵循一定规则的,Default Router 内置了一个默认映射表:

get — list

post — create

get — retrieve

put — update

patch — partial-update

delete — destroy

以上这些默认的方法,就是Default Router 的 标准方法

如果我们有自定义的 方法需要映射 就需要使用 2个装饰器 来完成映射:  HTTP 方法 — 资源方法

@list_route

这个装饰器 会获取资源对象的列表, 常用于 需要操作多个对象的时候。

@detail_route

这个装饰器 包含一个 pk, 会获取对于 pk 的单个 资源对象。常用于 操作单个对象的时候。

method参数: 这两个装饰器 都可以传人一个 method 参数, 用于 指定这个 资源方法 映射的对应的 http方法。

其他关键字也可以传入

django的restfulapi的更多相关文章

  1. Django的RestfulAPI框架RestFramework

    Django的Restful-API框架 安装框架 #sudo pip3 install django #sudo pip3 install markdown #sudo pip3 install d ...

  2. Django从Models 10分钟建立一套RestfulApi

    目录 Django从Models 10分钟建立一套RestfulApi Django从Models 10分钟定制一个Admin后台 简介 Django是一套完善而强大的web开发框架, 结合Djang ...

  3. 【Django】 rest-framework和RestfulAPI的设计

    [rest-framework] 这是一个基于django才能发挥作用的组件,专门用于构造API的. 说到API,之前在其他项目中我也做过一些小API,不过那些都是玩票性质,结构十分简单而且要求的设计 ...

  4. Django JWT Token RestfulAPI用户认证

    一般情况下我们Django默认的用户系统是满足不了我们的需求的,那么我们会对他做一定的扩展 创建用户项目 python manage.py startapp users 添加项目apps INSTAL ...

  5. [django]restfulapi请求规范

    http://www.ruanyifeng.com/blog/2014/05/restful_api.html 方法及作用: GET(SELECT) :从服务器取出资源(一项或多项). POST(CR ...

  6. Django Rest Framework-介绍

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

  7. Django之REST framework源码分析

    前言: Django REST framework,是1个基于Django搭建 REST风格API的框架: 1.什么是API呢? API就是访问即可获取数据的url地址,下面是一个最简单的 Djang ...

  8. 01: RestfulAPI与HTTP

    1.1 RestfulAPI与HTTP简介 1.什么是RestfulAPI 1.REST直接翻译:表现层状态转移,实质就是一种面向资源编程的方法 2.REST描述的是在网络中client和server ...

  9. [py]django的manytomany字段和后台搜索过滤功能

    我本来想搞下Django之select_related和prefetch_related的区别,看到这里有djangoapi的知识, 之前搞过django restfulapi,http://blog ...

随机推荐

  1. CentOS系统安装后的基础优化

    在运维工作中,我们发现Linux系统安装之后并不能立即投入生产环境使用,往往需要先经过我们运维人员的优化才行. 下面我就为大家简单讲解几点关于Linux系统安装后的基础优化操作. 注意:本次优化都是基 ...

  2. C#获取并修改文件扩展名的方法

    本文实例讲述了C#获取并修改文件扩展名的方法.分享给大家供大家参考.具体分析如下: 这里使用C#编程的方法改变文件扩展名的文件,必须使用Path类. Path类用来解析文件系统路径的各个部分.静态方法 ...

  3. VC++ : VS2008 使用ATL开发COM组件

    新建ATL Project,工程名命名为MyAtlCom: 出现工程 向导,一路“Next”: Add class,点击添加 ATL Simple Object , 类名CStatistic, 接口I ...

  4. php 用命令行导出和导入MySQL数据库

    命令行导出数据库:1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录如我输入的命令行:cd C:\Program Files\MySQL\MySQL Server 4.1\ ...

  5. 13年10月 月赛第一场 set 4 迷宫问题

    题目 给定一个n*m的迷宫,如S....#E.E其中,S代表开始位置,#代表不可行走的墙,E代表出口.主人公从开始位置出发,每次等概率的随机选择下一个可以行走的位置(可能会发生回溯),直到到达某一个出 ...

  6. POJ 1947 Rebuilding Road(树形DP)

    Description The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, n ...

  7. 第六篇:GPU 并行优化的几种典型策略

    前言 如何对现有的程序进行并行优化,是 GPU 并行编程技术最为关注的实际问题.本文将提供几种优化的思路,为程序并行优化指明道路方向. 优化前准备 首先,要明确优化的目标 - 是要将程序提速 2 倍? ...

  8. canvas二:绘制圆和其他曲线

    1.绘制圆 绘制圆是canvas里面不可缺少的功课,而且绘制圆在canvas中的用处很多,好嘞,开扯 绘制圆需要用到arc这个方法: arc(X坐标,Y坐标,半径,起始弧度,结束弧度,旋转方向): 弧 ...

  9. Anfroid 在界面中显示图片 ImageView

    ImageView1.什么是ImageView是显示图片的一个控件2.ImageView属性android:src ImageView的内容颜色 android:background ImageVie ...

  10. Django学习笔记 创建应用

    django中使用应用来分割功能.比如:做一个游戏网站,包含4块不同的功能:游戏新闻.游戏论坛.Blog系统.在线商城.使得结构清晰了,每一个应用实现不同的功能:便于复用:游戏新闻.游戏论坛.Blog ...