Django REST frameworker

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容