1. 总结:两功能
    序列化:
      a.拿到queryset --->idc = Idc.objects.all()
      b.将queryset给序列化成类---->serializer = IdcSerializer(idc, many=True)
      c.转json: --->content = JSONRenderer().render(serializer.data)用序列化类的data属性可以输出所有的数据是一个字典的,并转成json字符串
    反序列化:
      a.将字符串content转成流--->stream = BytesIO(content)
      b.将流转成序列化的数据字典--->data = JSONParser().parse(stream)
      c.将字典反序列化 -->serializer = IdcSerializer(data=data)
      d.验证并保存 --->serializer.is_valid() -->serializer.save()

 一.应用示例

  需求:把用户列表用带分页功能的展示出来。使用:视图函数+序列化类将Idc表列表取出来返回json数据。

  1. 需求分析:两个视图函数
  2. def idc_list():
  3. get方法:
  4. 返回所有记录
  5. post方法:
  6. 创建一条记录
  7. def idc_detail(pk):
  8. get方法:
  9. 返回指定(pk对应的)记录
  10. put方法:
  11. 修改指定记录
  12. delete方法:
  13. 删除这条记录

1.get请求方法:

(1)views.py:

  1. from django.shortcuts import render
  2. from django.http import HttpResponse
  3. from .models import Idc
  4. from .serializers import IdcSerializer
  5. from rest_framework.renderers import JSONRenderer
  6. def idc_list(request, *args, **kwargs):#接收request,位置,关键字参数
  7. if request.method == "GET":
  8. queryset = Idc.objects.all()
  9. serializer = IdcSerializer(queryset, many=True)
  10. content = JSONRenderer().render(serializer.data)
  11. return HttpResponse(content, content_type="application/json")
  12. elif request.method == "POST":
  13. pass
  14. return HttpResponse("")

(2)apps/idcs/urls.py:

  1. from django.conf.urls import url
  2. from .views import idc_list
  3. urlpatterns = [
  4. url(r"^idcs/$",idc_list)
  5. ]

(3)devops/urls.py:

  1. from django.conf.urls import include, url
  2. from django.contrib import admin
  3. urlpatterns = [
  4. url(r'^admin/', admin.site.urls),
  5. url(r'^', include("idcs.urls"))
  6. ]

(python36env) [vagrant@CentOS7 devops]$ python manage.py runserver 0.0.0.8000 启动后效果如下

 2.编写POST--

注意这里POST想要的数据不是request.POST的数据,drf提供了方案:它可以从我们的requset对象里直接拿,直接把request传给它就可以了。

先django shell中测试下:

  1. 命令行测试方式:
    (1)(python36env) [vagrant@CentOS7 ~]$ pip install httpie 安装http

(2)(python36env) [vagrant@CentOS7 ~]$ http --json POST http://127.0.0.1:8000/idcs/ aaa=bbb bbb=ccc
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/html; charset=utf-8
Date: Sat, 06 Jun 2020 03:34:25 GMT
Server: WSGIServer/0.2 CPython/3.6.6
X-Frame-Options: SAMEORIGIN

此时就能接收到数据如下:

(3)#python manage.py runserver 0.0.0.0:8000

[06/Jun/2020 03:33:36] "POST /idcs HTTP/1.1" 500 60032
{'aaa': 'bbb', 'bbb': 'ccc'}

  1. 或用postman软件测试: 在我们做前后端分离的项目的时候,这个工具测试后台接口还是非常便利的,如果我们想要在呼叫Web API时一并夹带JSON数据时就用它
  2.  
  3. (python36env) [vagrant@CentOS7 devops]$ python manage.py runserver 0.0.0.0:8000 执行就能收到提交的数据了
  4. {'name': 'a昆明机房', 'address': '昆明a', 'phone': '', 'email': 'rock@51reboot.com', 'letter': 'kma'}
    [06/Jun/2020 04:28:37] "POST /idcs/ HTTP/1.1" 200 0

 views.py中:

  1. from django.shortcuts import render
  2. from django.http import HttpResponse
  3. from .models import Idc
  4. from .serializers import IdcSerializer
  5. from rest_framework.renderers import JSONRenderer
  6. from rest_framework.parsers import JSONParser
  7.  
  8. #重写JsonResponse类为自定义json--实现你传一data数据我帮你序列化:它其实就是把下面两函数中重复的代码(注释部分)封装到此
  9. class JSONResponse(HttpResponse):
  10. def __init__(self,data,**kwargs):
  11. #指定为json
  12. kwargs.setdefault('content_type', 'application/json')
  13. #把data数据转换成json格式字符串
  14. content = JSONRenderer().render(data)
  15. #把字符串给httpresponse--super是执行父类的init方法
  16. super(JSONResponse, self).__init__(content=content, **kwargs)
  17.  
  18. def idc_list(request, *args, **kwargs):#接收request,位置,关键字参数
  19. if request.method == "GET":
  20. queryset = Idc.objects.all()
  21. serializer = IdcSerializer(queryset, many=True)
  22. return JSONResponse(serializer.data)
  23. # content = JSONRenderer().render(serializer.data)
  24. # return HttpResponse(content, content_type="application/json")
  25. elif request.method == "POST":
  26. #拿到json数据
  27. data = JSONParser().parse(request)
  28. #反序列化--把json数据给序列化类
  29. serializer = IdcSerializer(data=data)
  30. if serializer.is_valid():
  31. serializer.save()
  32. # content = JSONRenderer().render(serializer.data)
  33. # return HttpResponse(content, JSONRenderer().render(serializer.data))
  34. return JSONResponse(serializer.data)
  35. return HttpResponse("")

此时命令行中也可直接测试并拿到数据:

(python36env) [vagrant@CentOS7 devops]$ http http://127.0.0.1:8000/idcs/      get请求

HTTP/1.1 200 OK

[
{
"address": "昆明",
"email": "rock@51reboot.com",
"id": 1,
"letter": "km",
"name": "昆明机房",
"phone": "1234568"
},
{
"address": "大理",
"email": "rock@51reboot.com",
"id": 2,
"letter": "dl",
"name": "大理机房"

3.编写idc_detail

(1)views.py中:

  1. from django.shortcuts import render
  2. from django.http import HttpResponse
  3. from .models import Idc
  4. from .serializers import IdcSerializer
  5. from rest_framework.renderers import JSONRenderer
  6. from rest_framework.parsers import JSONParser
  7.  
  8. #重写JsonResponse类为自定义json--实现你传一data数据我帮你序列化:它其实就是把下面两函数中重复的代码(注释部分)封装到此
  9. class JSONResponse(HttpResponse):
  10. def __init__(self,data,**kwargs):
  11. #指定为json
  12. kwargs.setdefault('content_type', 'application/json')
  13. #把data数据转换成json格式字符串
  14. content = JSONRenderer().render(data)
  15. #把字符串给httpresponse--super是执行父类的init方法
  16. super(JSONResponse, self).__init__(content=content, **kwargs)
  17.  
  18. def idc_list(request, *args, **kwargs):#接收request,位置,关键字参数
  19. if request.method == "GET":
  20. queryset = Idc.objects.all()
  21. serializer = IdcSerializer(queryset, many=True)
  22. return JSONResponse(serializer.data)
  23. # content = JSONRenderer().render(serializer.data)
  24. # return HttpResponse(content, content_type="application/json")
  25. elif request.method == "POST":
  26. #拿到json数据
  27. data = JSONParser().parse(request)
  28. #反序列化--把json数据给序列化类
  29. serializer = IdcSerializer(data=data)
  30. if serializer.is_valid():
  31. serializer.save()
  32. # content = JSONRenderer().render(serializer.data)
  33. # return HttpResponse(content, JSONRenderer().render(serializer.data))
  34. return JSONResponse(serializer.data)
  35. return HttpResponse("")
  36.  
  37. def idc_detail(request, pk, *args, **kwargs):
  38. #先获取pk--主键,可能会出错
  39. try:
  40. idc = Idc.objects.get(pk=pk)
  41. #不存在则直接抛出404
  42. except Idc.DoesNotExist:
  43. return HttpResponse(satatus=404)
  44. #如果有pk且请求方法是get那就直接给序列化
  45. if request.method == "GET":
  46. serializer = IdcSerializer(idc)
  47. return JSONResponse(serializer.data)
  48. #put表示修改
  49. elif request.method == "PUT":
  50. #拿到数据解析参数
  51. content = JSONParser().parse(request)
  52. #idc是原始数据,data是修改成什么样的数据
  53. serializer = IdcSerializer(idc, data=content)
  54. if serializer.is_valid():
  55. serializer.save()
  56. return JSONResponse(serializer.data)
  57. return JSONResponse(serializer.errors, status=400)
  58. elif request.method == "DELETE":
  59. idc.delete()
  60. #返回空
  61. return HttpResponse(status=204)

(2)apps/idcs/urls.py:

  1. from django.conf.urls import url
  2. from .views import idc_list, idc_detail
  3. urlpatterns = [
  4. url(r"^idcs/$",idc_list),
  5. url(r"^idcs/(?P<pk>[0-9]+)/$",idc_detail)
  6. ]
  1. 命令行测试中访问能拿到数据了:
    (python36env) [vagrant@CentOS7 devops]$ http http://127.0.0.1:8000/idcs/1/ get请求
  2. HTTP/1.1 200 OK
  3. {
  4. "address": "昆明",
  5. "email": "rock@51reboot.com",
  6. "id": 1,
  7. "letter": "km",
  8. "name": "昆明机房",
  9. "phone": ""
  10. }

如postman测试修改第一条记录:

(python36env) [vagrant@CentOS7 devops]$ http http://127.0.0.1:8000/idcs/1/   终端验证改的结果

{
"address": "昆明",
"email": "rock@511111reboot.com",    ---->改了
"id": 1,
"letter": "km", 
"name": "昆明机房",
"phone": "1234568"
}

二.包装API,包装url,api_root

  1. 1.包装API:
  2. 用于基于函数视图的@api_view装饰器。
  3. 用于基于类视图的APIView类。
    如下使用:

from rest_framework.decorators import api_view #导入装饰器api
from rest_framework import status #导入状态码
from rest_framework.response import Response
@api_view(["GET","POST"])
def idc_list_v2(requset, *args, **kwargs):

2.包装url:给我们的网址添加可选的格式后缀

  1. http://127.0.0.1:8000/idcs.json
  2. http://127.0.0.1:8000/idcs/2.json
    urls.py中导入如下方法即可解决:

from rest_framework.urlpatterns import format_suffix_patterns
urlpatterns = format_suffix_patterns(urlpatterns)

3.视图集

  • REST框架包括一个用于处理ViewSets的抽象,它允许开发人员集中精力对API的状态和交互进行建模,并根据常规约定自动处理URL构造。
  • ViewSet类与View类几乎相同,不同之处在于它们提供诸如read或update之类的操作,而不是get或put等方法处理程序。
  • ViewSet类只绑定到一组方法处理程序,当它被实例化成一组视图的时候,通常通过使用一个Router类来处理自己定义URL conf的复杂性。

4.使用路由器

因为我们使用的是ViewSet类而不是View类,我们实际上不需要自己设计URL。将资源连接到视图和url的约定可以使用Router类自动处理。我们需要做的就是使用路由器注册相应的视图集,然后让它执行其余操作。

5.视图(views)vs视图集(viewsets)之间的权衡

  • 使用视图集可以是一个非常有用的抽象。它有助于确保URL约定在你的API中保持一致,最大限度地减少编写所需的代码量,让你能够专注于API提供的交互和表示,而不是URLconf的细节。
  • 这并不意味着采用视图集总是正确的方法。在使用基于类的视图而不是基于函数的视图时,有一个类似的权衡要考虑。使用视图集不像单独构建视图那样明确。

二.drf之使用序列化编写视图的更多相关文章

  1. 经历了源码的痛苦,掌握DRF的核心序列化器

    目录 DRF的核心--序列化器 序列化器 什么是序列化和反序列化? 序列化 序列化demo 字段类型 字段参数 序列化自定制返回字段 方法一:在序列化类(serializers.py)中写 方法二:在 ...

  2. DRF中的序列化器

    DRF中的序列化器详细应用   视图的功能:说白了就是接收前端请求,进行数据处理 (这里的处理包括:如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化:如果前端是POST请求,假如要对数 ...

  3. Django基础--Django基本命令、路由配置系统(URLconf)、编写视图、Template、数据库与ORM

    web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构. 使用框架可以帮你快速开发特定的系统. 简单地说,就是你用别人搭建好的舞台来做表演. 尝试搭建一个简单 ...

  4. day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能

    目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...

  5. 使用Typescript重构axios(二十八)——自定义序列化请求参数

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  6. DTCMS插件的制作实例电子资源管理(二)Admin后台页面编写

    总目录 插件目录结构(一) Admin后台页面编写(二) 前台模板页编写(三) URL重写(四) 本实例旨在以一个实际的项目中的例子来介绍如何在dtcms中制作插件,本系列文章非入门教程,部分逻辑实现 ...

  7. Django---手动编写视图

    手动编写视图 一. Request----->URL---->业务处理(Views)(Http Response) Response-------> 二. VOE    Django ...

  8. 二、Django用Eclipse编写一个登录界面

    一.Django用Eclipse编写一个登录界面 二.Django用Eclipse编写一个登录界面Ajax和Django交互 各软件版本:Python 2.7.14,django 1.6.11 原来已 ...

  9. 【DRF框架】序列化组件

    DRF框架的序列化组件 在前后端分离的应用模式中,后端仅返回前端所需的数据,返回的数据类似是JSON,因此需要使用序列化组件进行序列化再将数据返回 使用JsonResponse做序列化 #  使用Js ...

随机推荐

  1. (Java实现) 洛谷 P1605 迷宫

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...

  2. Java实现蓝桥杯二项式的系数规律

    二项式的系数规律,我国数学家很早就发现了. 如[图1.png],我国南宋数学家杨辉1261年所著的<详解九章算法>一书里就出现了. 其排列规律: 1 1 1 2 1 3 3 1 4 6 4 ...

  3. java实现第四届蓝桥杯快速排序

    快速排序 题目描述 快速排序算法是典型的分治思想的运用.它使用某个key把全部元素分成两组,其中一组的元素不大于另一组.然后对这两组再次进行递归排序. 以下代码实现了快速排序.请仔细阅读代码,填写缺少 ...

  4. CDN百科 | 假如没有CDN,网络世界会变成什么样?

    很多人都知道CDN是内容分发加速,所谓内容分发,就是将本来位于源站的内容分发到全国各地的节点,方便用户去就近访问所需的内容.随着移动互联网.云计算等一代代技术变革,CDN已经成为了缓解互联网网络拥塞. ...

  5. java创建透明背景的PNG图片加自定义文字水印

    人在码上走,需求天天有.这不,今天前端让我返回一个带自定义水印的背景图片.一通google,有现成的代码,但是基本是直接在源图上添加水印,生成出来的文字样式也没有控制好,看来又只有自己造轮子了. 过程 ...

  6. 别在重复造轮子了,几个值得应用到项目中的 Java 开源库送给你

    我是风筝,公众号「古时的风筝」.文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面.公众号回复『666』获取高清大图. 风筝我作为一个野路子开发者,直到 ...

  7. mysql小数类型

    原文链接:https://blog.csdn.net/weixin_42047611/article/details/81449663 MySQL 中使用浮点数和定点数来表示小数. 浮点类型有两种,分 ...

  8. Linux服务器安装python3.6

    CentOS 7上默认安装的python版本是2.7.5,系统自带的旧版本python被系统很多其他软件环境依赖,因此不能卸载原Python,直接选择Python3.6.5进行全新安装. 1 安装Py ...

  9. Shiro反序列化复现

    Shiro反序列化复现 ——————环境准备—————— 目标靶机:10.11.10.108 //docker环境 攻击机ip:无所谓 vpsip:192.168.14.222 //和靶机ip可通 1 ...

  10. 一行代码让你的python运行速度提高100倍

    转自:https://www.cnblogs.com/xihuineng/p/10630116.html 加上之后运行速度快了十倍,我的天呐. python一直被病垢运行速度太慢,但是实际上pytho ...