zoukankan      html  css  js  c++  java
  • django的restfulapi

    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方法。

    其他关键字也可以传入

  • 相关阅读:
    [ACM_模拟] ZJUT 1155 爱乐大街的门牌号 (规律 长为n的含k个逆序数的最小字典序)
    [ACM_搜索] ZOJ 1103 || POJ 2415 Hike on a Graph (带条件移动3盘子到同一位置的最少步数 广搜)
    [ACM_动态规划] POJ 1050 To the Max ( 动态规划 二维 最大连续和 最大子矩阵)
    [ACM_搜索] POJ 1096 Space Station Shielding (搜索 + 洪泛算法Flood_Fill)
    [JAVA] java_实例 获得系统字体
    [JAVA] java仿windows 字体设置选项卡
    [JAVA] 一个可以编辑、编译、运行Java简单文件的记事本java实现
    [ACM_模拟] POJ 1094 Sorting It All Out (拓扑排序+Floyd算法 判断关系是否矛盾或统一)
    JS的数组相关知识
    JS的join方法
  • 原文地址:https://www.cnblogs.com/muzinan110/p/5287552.html
Copyright © 2011-2022 走看看