美文网首页
Django REST frameworker

Django REST frameworker

作者: 梦醒家先生 | 来源:发表于2018-09-05 11:21 被阅读0次

    Django REST frameworker

    • 为什么使用DRF

      1. 在序列化与反序列化操作时,执行的过程相似,将重复的代码简化编写
      2. 在开发REST API视图时,每个视图具体操作数据不同,但是CURD的实现流程基本套路化
    • 特点

      1. 构建WEB API的强大工具。(DRF框架,是建立在Django框架上,二次开发项目)
      2. 提供了定义序列化器Serializer方法,快速根据Django ORM自动完成数据库的序列化//反序列化
      3. 提供了丰富的类视图、Mixin扩展类,简化视图的编写
      4. 函数视图、类视图、视图集合到自动生成API。多种身份验证和权限验证支持。
      5. 内置限流系统。直观的API web界面

    REST

    ​ >>> Repersentational State Transfer("具象状态传输"。一般解释为“表现层 状态转换”。 )

    ​ >>> REST是设计风格而不是标准,指Celent 和 Server 交互的形式。

    • Representational

      具象:(表现层) Celent 访问 Server 获取资源的表现(html,txt,json。。。)

      表现:获取的资源对象,以什么形式展现出来-->在HTTP请求头部中Accept和Content-Type字段中指定

    • State Transfer

    状态转化:客户端操作数据库,必须通过某种手段,让服务器发生状态转化

    HTTP协议中:4个操作方式的动词(GET、POST、PUT、DELETE )来表现 Celent 和 Server 交互的过程

    RESTful架构

    • 每一个URL代表一种资源
      1. 域名:将 api 部署在专用域名下
      2. 版本:将 API 的版本号放在 url 中
      3. 路径:路径表示 API 的具体网址。每个网址代表一种资源 。网址中不能有动词,名词一般=与数据库的表名相对应,使用复数。
    • 客户端和服务器之间,传递这种资源的某种表现层
    • 客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

    REST接口开发核心任务

    1. 将程序中的一个数据库结构类型(模型类对象)转换为响应的数据(JSON、XML、Dict)——>序列化过程
    2. 对数据库操作的过程。(封装了对数据库的操作方法)
    3. 将前端传递其他的格式(字典,JSON,XML)等转化为程序中的数据(模型类对象)——>反序列化过程

    DRF工程搭建

    ​ >>>DRF框架依赖Django框架对其扩展应用,python。

    1. pip install djangorestframeworker
    2. 在INSTALLED_APPS里面注册扩展应用

    Serializer序列化器

    ​ >>> 作用:1. 对数据对象进行转换、响应 2.进行数据的校验、保存

    ​ >>> 定义:1. 自定义序列化器 继承自:serializers.Serializer( 字段一一定义、校验、创建、更新)

    ​ 2. 继承了最高级的序列化器语法 :serializers.ModelSerializer(指定model、fields)

    创建Serializer对象

    • 在View中调用创建好的序列化器对象

    • Serializer类构造方法:

      **Serializer(instance=None, data=empty, **kwarg)

      1.序列化:将模型类对象传入instance

      2.反序列化:将被反序列化的数据传入data参数

      3.构造Serializer对象时,可以添加context参数增加额外参数,用于View和序列化之间数据的传递

    • 在序列化文件中通过context参数附加的数据,可以通过Serializer对象的context属性获取。

    序列化

    1. 获取模型类对象(根据模型类对象Django-ORM的CURD)

    2. 创建序列化器对象—>序列化操作(将模型类对象传入)

    3. 获取序列化的自定义字段(或者根据模型类字段,进行定义)

    4. 序列化器对象.data:data属性获取序列化对象的数据(字典,返回的数据就是定义在序列化器中定义的字段)

      ser = BookInfoSerializer1(books, many=True)

      return Response(ser.data)

    反序列化器

    1. 反序列化时,需要对请求的数据验证成功,才能对数据修改/保存模型类对象

    2. 反序列化前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False

    3. 验证失败,可使用序列化器对象的errors属性获取错误信息,字典形式返回{ '字段':'错误信息' }

    4. 验证成功,可使用序列化器对象的validated_data属性获取数据.

      1.先获取数据

      data = request.data

      2.对获取的数据进行校验

      ser = Serializer(data=data)

      ser.is_valid()

      3.添加数据

      ser.save()

      返回数据

      return Response(ser.data)

    反序列化注意点

    1. 在对序列化器进行save()保存时,可以额外传递数据,这些数据可以在create()和update()中的validated_data参数获取到。

    ser.save(owner=request.user)

    def create(self, validated_data):
         owner = validated_data.get('owner', None)
            pass
    
    def update(self, instance, validated_data):
         instance.owner = validated_data.get('owner', None)
            pass
    
    1. 默认序列化器必须传递所有required的字段,否则会抛出验证异常。但是我们可以使用partial参数来允许部分字段更新

      ser = Serializer(obj, data=data,partial=True)

    视图

    Request

    1. REST framework 提供了Parser解析器,请求后会自动根据Content-Type指明的请求数据类型,将请求数据进行parse解析,解析为类字典对象保存到Request对象中。

    2. Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。

    属性

    1. .data

    request.data 返回解析之后的请求体数据

    1. .query_params

    request.query_params与Django标准的request.GET相同。

    1. .user

      请求的用户对象(获取已登陆的用户请求对象)

    Response

    1. REST framework提供了一个响应类Response,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。

      Response响应构造方式:

      Response(data, status=None, template_name=None, headers=None, content_type=None)

      data:传给response对象的序列化后,但是没有render处理的数据

    2. REST framework提供了Renderer 渲染器,用来根据请求头中的Accept(接收数据类型声明)来自动转换响应数据到对应格式。

    状态码

    1. 信息告知 -1X

    2. 成功 -2X

    3. 重定向-3X(成功请求)

    4. 客户端请求错误-4X

    5. 服务器错误-5X

    视图两个基类

    >>>作用:1.控制序列化器的执行 。2. 控制数据库查询的执行
    

    APIView

    封装继承Django的View父类,提供了所有的视图基类

    APIView视图中没有封装HTTP的动作方法;还需自定义方法

    APIView和View的区别

    1. 传入了视图Resquest和Response对象不同

    2. 任何APIException异常都会被捕获到

    3. 在基类View进行dispatch()分发前,会对请求进行身份验证、权限验证、流量控制

      属性

      1. authentication_classes :身份验证
      2. permissoin_classes :权限认证
      3. throttle_classes :流量控制

    GenericAPIView

    序列化器使用:

    1. 属性和方法

      属性: serializer_class指明视图中使用的序列化器

      方法:get_serializer() 获取序列化器对象(可重写)

      注意点:该方法提供序列化器对象的时候,会向序列化器对象的context属性传递三个数据 。

      def get_serializer(self, *args, **kwargs):
              """
              Return the serializer instance that should be used for validating and
              deserializing input, and for serializing output.
              """
              serializer_class = self.get_serializer_class()
              kwargs['context'] = self.get_serializer_context()
              # 返回序列化器对象
              return serializer_class(*args, **kwargs)
      
      def get_serializer_context(self):
              """
              在定义序列化器对象时候使用,会向序列化器对象的context属性补充三个数据
              """
              return {
                  'request': self.request, # 当前视图的请求对象
                  'format': self.format_kwarg, 
                  'view': self #当前请求的类视图对象
              }
      

    数据库的使用:

    1. 属性和方法:

      属性:queryset 指明数据库的查询集—>数据库特性:惰性/缓存

      方法:get_queryset()获取数据对象,返回查询集queryset属性;get_object(self)获取单个的查询对象

      def get_query(self):
       "对其方法的重写,返回指定的查询集对象"
       category_id = self.kwargs["category_id"]
       # 向指定的查询集添加属性;获取分类id对象
       hot_skus = SKu.object.filter(category_id=category_id,is_launched=True)
       return hot_skus
      
      def view(request, *args, **kwargs):
       """在路由中获取数据,保存在View视图中“”“
          self = cls(**initkwargs)
          if hasattr(self, 'get') and not hasattr(self, 'head'):
          self.head = self.get
          self.request = request # 。。。
          self.args = args
          self.kwargs = kwargs # 。。。
       return self.dispatch(request, *args, **kwargs)
       
      
    1. 其他属性

      pagination_class 指明分页控制类(自定义分页器)

      class LargeResultsSetPagination(PageNumberPagination):
          """
          自定义分页器,继承分页器PageNumberPagination
          请求方法:127.0.0.1/books/?page=1&page_size=5
          """
          page_size = 5   # 每页的数量
          max_page_size = 10  # 前端最多能设置的每页数量
          # page_query_param = 'page'   # 前端发送的页数关键字名,默认为"page"
          page_size_query_param = 'page_size'  # 前端发送的每页数目关键字名,默认为None
      

      filter_backends 指明过滤控制后端

    五个扩展类

    作用:提供后端视图对数据库的CURD处理流程的实现,继承扩展类来复用代码

    两个基本类:就是为扩展类提供属性和方法。五个扩展类需要搭配基类(GenericAPIView)

    ​ 要实现序列化器与数据库的查询的方法。

    1. 方法

      1)ListModelMixin 2)CreateModelMixin

      3) RetrieveModelMixin 4)UpdateModelMixin 5)DestroyModelMixin

    相关文章

      网友评论

          本文标题:Django REST frameworker

          本文链接:https://www.haomeiwen.com/subject/wtfawftx.html