1、RESTful规范

  1.1 REST风格:表属性状态转移

    1.1.1资源:在web中凡是有被引用的必要的都叫资源

    1.1.2 URI:统一资源标识符    URI包含URL

    1.1.3 URL:统一资源定位符

    1.1.4 统一资源接口,不再像以前django项目中url中增删改查都分别对应一个url,而是url中只写一个名词最为代表性的

        路由,比如(只写book,不需要book_list,book_append,book_edit,book_delate),其他的功能根据HTTP请求方式

        的不同来对资源进行操作。

    1.1.5 前后端传递的是资源的表述

    1.1.6 前端展示的是资源的状态

    1.1.7 通过超链接的指引来告诉用户接下来有哪些资源状态可以进入

  1.2 核心思想:

    1.2.1 面向对象去编程,url中尽量用名词,不要用动词

    1.2.2 根据HTTP请求方式的不同对资源进行不同的操作。

  1.3 url中要体现的信息

    1.3.1 版本

    1.3.2 API

    1.3.3 过滤条件

    1.3.4 HTTPS

  1.4 返回的要求

    1.4.1 要携带状态吗

    1.4.2 返回值

        get 获取的是所有或者单挑数据

        post 返回的是新增的这条数据

        put/patch 返回的是更新的数据

        delete 返回空

    1.4.3 携带错误信息

    1.4.4 携带超链接

2、FBV 和 CBV 的区别

    def dispatch(self, request, *args, **kwargs):
    # GET POST
    # BookView().get
    # DJango的View只做了CBV的分发
    if request.method.lower() in self.http_method_names:
    handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
    handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)

3、下载DRF

    pip istall djangorestframwork

    在settings的APP项中注册rest_framwork

4、APIView 和View的区别

  4.1、APIView继承了View

  4.2、重写了as_view方法,豁免了csrf

  4.3、重新封装了request

      新的request变成了Request的实例化对象,

        request = self.initialize_request(request, *args, **kwargs)
        self.request = request

      旧的request 变成了_request

        self._request = 旧的request  

        def query_params(self):
          return self._request.GET
        def data(self):
          return post请求的数据

5、序列化

  5.1 django实现序列化

    5.1.1 通过.values 获取到QuerySet对象 ,通过JsonResponse进行序列化。JsonResponse和HttpResponse的区别是能

      够处理date/datetime类型的数据,但都不能解决外键关系的序列化

    5.1.2 django的序列化器 serializes.seialize 能够序列化queryset,但是也不能解决外间关系的序列化

  5.2 DRF的序列化组件

    5.2.1 先声明一个序列化器,类比django中的model.py文件

    5.2.2 在视图中使用序列化器序列化queryset

    5.2.3 序列化好的数据在set_obj.data中

  5.3 对于GET请求

    5.3.1 先获取Book对象的所有信息

       book_queryset = Book.objects.all()

    5.3.2 ser_obj = BookSerializer(book_queryset,many=True)

      如果有many=True 认为我们的queryset是一个可迭代对象,循环我们的queryset拿到每一个模型对象

      把每个模型对象的字段跟序列化器的字段进行匹配,匹配成功的进行序列化,没有匹配成功的丢弃,

      但是序列化器里的字段必须在要匹配的字段中

  5.4 对于POST请求

    5.4.1 注意序列化和反序列化不统一的字段

        id = serializers.IntegerField(required=False)      required=False表示之序列化,不进行校验

        read_only = True :表示只进行正向序列化

        write_only = True:表示只进行反向序列化

    5.4.2 视图中      

    def post(self, request):
book_obj = request.data # data是post提交的数据
ser_obj = BookSerializer(data=book_obj)
print(type(ser_obj), ser_obj)
if ser_obj.is_valid():
ser_obj.save() # 此save不同于ORM操作中的save,此save只是单纯的调用了create方法,所以要去重写create方法,其实是create方法对数据进行了保存
return Response(ser_obj.validated_data)
return Response(ser_obj.errors)

    5.4.3 重写create方法

def create(self, validated_data):
book_obj = Book.objects.create(title=validated_data['title'],
publisher_time=validated_data['publisher_time'],
category=validated_data['post_category'],
publisher_id=validated_data['publisher_id'],
)
book_obj.authors.add(*validated_data['author_list'])
return book_obj

  5.5对于PUT/PATCH请求

    5.5.1在视图中

    def put(self, request, id):
book_obj = Book.objects.filter(id=id).first()
ser_obj = BookSerializer(instance=book_obj, data=request.data, partial=True)
if ser_obj.is_valid():
ser_obj.save() # 在put中,save()的时候需要重写update方法
return Response(ser_obj.validated_data)
return Response(ser_obj.errors)

    5.5.2重写的update

    def update(self, instance, validated_data):
# instance 更新的book_obj 对象
# validated_data 校验通过的数据
# ORM做更新操作
instance.title = validated_data.get("title", instance.title) #字典.get取值的时候即使没有也不会报错
instance.pub_time = validated_data.get("pub_time", instance.pub_time)
instance.category = validated_data.get("post_category", instance.category)
instance.publisher_id = validated_data.get("publisher_id", instance.publisher_id)
if validated_data.get("author_list"):
instance.authors.set(validated_data["author_list"])
instance.save()
return instance

  6.1验证

    6.1.1局部钩子函数

    def validate_title(self, value):           # 局部钩子需要传value作为参数
print(2222)
# value就是title的值 对value处理
if "python" not in value.lower():
raise serializers.ValidationError("标题必须含有python")
return value

    6.1.2全局钩子函数

    def validate(self, attrs):        # 全局钩子,需要传参数attrs
print(33333)
# attrs 字典有你传过来的所有的字段
print(attrs)
if "python" in attrs["title"].lower() or attrs["post_category"] == 1:
return attrs
else:
raise serializers.ValidationError("分类或标题不合符要求")

    6.1.3自定义验证函数

def my_validate(value):                 # 自定义的函数,没有self,把value作为参数
print(1111)
if "敏感信息" in value.lower():
raise serializers.ValidationError("有敏感词汇")
return value
# 对于自定义的函数,需要在序列化器中的字段中加入validators=[my_validate,]
# title = serializers.CharField(max_length=32, validators=[my_validate,])

    6.1.4 验证的钩子函数,优先级分别是    自定义 > 局部钩子 > 全局钩子

    6.1.5 普通序列化器处理正反序列化的方法

  

from rest_framework import serializers
from DRF_Demo.models import Book, Publisher
from rest_framework.response import Response class PublisherSerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField(max_length=32) class AuthorSerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField(max_length=32) class BookSerializer(serializers.Serializer):
id = serializers.IntegerField(required=False) # required=False 只序列化不校验
title = serializers.CharField(max_length=32)
publisher_time = serializers.DateField()
category = serializers.CharField(source='get_category_display', read_only=True) publisher = PublisherSerializer(read_only=True)
authors = AuthorSerializer(many=True, read_only=True)
post_category = serializers.IntegerField(write_only=True) # 对于反序列化的字段名称匹配的时候,要和提交的数据的字段相同
publisher_id = serializers.IntegerField(write_only=True)
author_list = serializers.ListField(write_only=True) def create(self, validated_data):
book_obj = Book.objects.create(title=validated_data['title'],
publisher_time=validated_data['publisher_time'],
category=validated_data['post_category'],
publisher_id=validated_data['publisher_id'],
)
book_obj.authors.add(*validated_data['author_list'])
return book_obj def update(self, instance, validated_data):
instance.title = validated_data.get("title", instance.title)
instance.save()
return instance

  7.1 ModelSerializer

    7.1.1 类似于Django中的modelform,用于生成关联的模型里的所有字段   

       model=表名
       fields="__all__"/["字段名",]
       exclude=["字段名",]
       depth=1 外键关系找一层 会让外键关系字段变成read_only=True
       extra_kwargs={"字段名": {配置的属性}}      # 对于不想要正序或者反序的字段,就用extra_kwargs={'字段名':属性}}

    7.1.2 SerlizerMethodField() 对于重写的正向序列化的字段,用这个方法字段来定义

    7.1.2 示例,用ModelSerilizer方法进行正反序列化,包括校验字段

class BookSerializer(serializers.ModelSerializer):
# SerializerMethodField是个方法字段,需要用get_publisher_info 来定义方法
publisher_info = serializers.SerializerMethodField(read_only=True)
authors_info = serializers.SerializerMethodField(read_only=True) # 通过get_变量名制定方法,obj是Book对象
def get_publisher_info(self, obj):
publisher_obj = obj.publisher
# return 回来的结果返回给publisher_info,然后渲染到页面上
return {"id": publisher_obj.id, "name": publisher_obj.name} def get_authors_info(self, obj):
authors_obj = obj.authors.all()
return [{'id': author.id, 'name': author.name} for author in authors_obj] class Meta:
model = Book
fields = '__all__'
# depth = 1 # depth 写几就是外键向下找几层,一般不要超过四层。并且会让所有外键变成read_only=True
# extra_kwargs 是一个字典,处理序列化的字段,如果正向序列化不想要展现publisher 和authors字段,就将他设置成write_only=True
extra_kwargs = {'publisher': {"write_only": True}, 'authors': {"write_only": True}}
# 定义一个局部钩子函数,validate_字段名,校验title,参数要传一个value
def validate_title(self, value):
if 'python' not in value.lower():
raise serializers.ValidationError('标题必须含有python')
return value
def validate(self,attrs):
if 'python' in attrs["title"].lower() or attrs["authors_info.id"] == 1:
return attrs
else:
raise serializers.ValidationError('分类或标题不符合要求')

DRF框架的更多相关文章

  1. DRF框架之认证组件用法(第四天)

    1. 什么是drf 框架的认证组件: auth 就等于是jango中的Auth模块,Auth是自带session信息,但是 drf的认证组件可以自定义token携带过去,去判断用的 2.如何实现认证呢 ...

  2. DRF框架之视图方法的几个封装好的模块介绍(第三天)

    1.DRF框架给我们封装好了好多层模块的 来实现简便接口的编写 # from rest_framework.mixins import CreateModelMixin, UpdateModelMix ...

  3. 一、restful规范 二、CBV(View)源代码执行流程 三、drf框架安装和简单使用

    一.restful规范 ''' 它是一个规范,面向资源架构 十条规范 1.API与用户的通讯协议,总是使用HTTPs协议,确保了网络传输的安全性 2.域名 --https://api.example. ...

  4. DRF框架之 serializers 序列化组件

    1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers ...

  5. DRF框架简介(第一天)

    1.drf框架全称 djangorestframework 1.如何安装drf框架: pip3 install djangorestframework #drf框架其实就是一个app称之为drf #d ...

  6. 写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用

    写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用 一.了解什么是DRF DRF: Django REST framework Django REST framew ...

  7. django drf框架中的user验证以及JWT拓展的介绍

    登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个 ...

  8. drf 框架

    一. drf简介 drf框架,全程: django-rest framework  ,   rest是插件名字,django插件的名字叫rest,framework是框架的意思 二. 接口 在平时生活 ...

  9. DRF框架学习总结

    DRF框架安装配置及其功能概述 Django与DRF 源码视图解析 DRF框架序列化和返序列化 DRF框架serializers中ModelSerializer类简化序列化和反序列化操作 DRF源码s ...

  10. drf框架接口文档

    drf框架接口文档 REST framework可以自动帮助我们生成接口文档. 接口文档以网页的方式呈现. 自动接口文档能生成的是继承自APIView及其子类的视图. 一.安装依赖 pip insta ...

随机推荐

  1. 刷题总结——过河(NOIP2015)

    题目: 题目背景 NOIP2005提高组试题2. 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都 ...

  2. Failed building wheel for Twisted

    在安装scrapy框架的过程中,pip install scrapy 出现报错信息: building 'twisted.test.raiser' extension error: Microsoft ...

  3. hdu 4430 Yukari's Birthday 枚举+二分

    注意会超long long 开i次根号方法,te=(ll)pow(n,1.0/i); Yukari's Birthday Time Limit: 12000/6000 MS (Java/Others) ...

  4. asp.net MVC最简单的增删查改!(详)

    折腾了两天搞出来,但原理性的东西还不是很懂,废话不多说上图上代码 然后右键models,新建一个数据模型 注意我添加命名为lianxi 添加后如上 接下来在controllers添加控制器还有在Vie ...

  5. sugar与阿龙的互怼(第一季)

    §   第一季 回家风波 高考了,啦啦啦~ 快要高考了,显然sugar很伤心. 显然不是因为快要考试了sugar才伤心的. 那为什么??? 因为他们都回家了,但是sugar和他的小伙伴们都不回家!!! ...

  6. STM32 GPIO寄存器 IDR ODR BSRR BRR

    IDR是查看引脚电平状态用的寄存器,ODR是引脚电平输出的寄存器 下面内容的原文:http://m646208823.blog.163.com/blog/static/1669029532012931 ...

  7. ubuntu16.04安装mysql5.7.15

    1.在官网下载mysql安装包 直接选择第一个下载好了就行 2.进入你的下载文件夹下面 键入命令: tar -xvf mysql-server_5.7.13-1ubuntu16.04_i386.deb ...

  8. Cesium调用Geoserver发布的 WMS、WFS服务

    1 GeoServer服务发布 1.1 WMS服务 下载GeoServer安装版安装,同时安装geopackage扩展,以备使用.使用XX地图下载器下载地图,导出成GeoPackage地图文件. (1 ...

  9. Java生成读取条形码和二维码图片

    原文:http://www.open-open.com/code/view/1453520722495 package zxing; import com.google.zxing.BarcodeFo ...

  10. centos下开启htaccess

    不知道原本 centOS是否默认支持 .htaccess 可能是因为我总弄配置文件无意中给搞坏了 今天要用到就查了下怎么开启 想要顺利开启需注意以下几点, 这几点都是在httpd.conf 这个配置文 ...