使用Django开发REST接口

  我们以在Django框架中使用的图书以及书中人物案例来写一套支持图书数据增删改查REST API接口,来理解REST API的开发(前后端均发送JSON格式数据)

路由代码(urls.py):

  1. urlpatterns = [
  2. path('books/', views.BookListView.as_view()),
  3. re_path('books/(?P<pk>\d+)/', views.BookDetailView.as_view())
  4. ]

views.py:

  1. from datetime import datetime
  2. from django.http import JsonResponse,HttpResponse
  3. import json
  4.  
  5. class BookListView(View):
  6. """
  7. 查询所有的书籍、增加书籍
  8. """
  9. def get(self,request):
  10. """
  11. 查询所有的书籍,
  12. 路由:GET /books/
  13. :param request:
  14. :return:
  15. """
  16. queryset = BookInfo.objects.all()
  17. book_list = []
  18. for book in queryset:
  19. book_list.append({
  20. "id":book.id,
  21. "btitle":book.title,
  22. "bpub_date":book.pub_date,
  23. "bread":book.read,
  24. "bcommet":book.comment,
  25. "image":book.image.url if book.image else ""
  26. })
  27. #为了不使字典的数据发送,将参数safe变为False
  28. return JsonResponse(book_list,safe=False)
  29.  
  30. def post(self,request):
  31. """
  32. 新增书籍
  33. 路由:POST/books/
  34. :param request:
  35. :return:
  36. """
  37. json_bytes = request.body
  38. json_str = json_bytes.decode()
  39. #将字符串对象反序列化
  40. book_dict = json.loads(json_str)
  41. ################################
  42. book = BookInfo.objects.create(
  43. title = book_dict.get("btitle"),
  44. pub_date = book_dict.get("bpub_date")
  45. #.....................省略其他参数
  46. )
  47. #返回插入的数据,以json格式返回,并且带上状态码
  48. return JsonResponse({
  49. "id":book.id,
  50. "btitle":book.title,
  51. 'bpub_date': book.pub_date,
  52. 'bread': book.read,
  53. 'bcomment': book.comment,
  54. 'image': book.image.url if book.image else ''
  55. },status=201)
  56. class BookDetailView(View):
  57. def get(self,request,pk):
  58. """
  59. 获取单个图书信息
  60. 路由:GET/books/<pk>/
  61. :param request:
  62. :param pk:
  63. :return:
  64. """
  65. try:
  66. book = BookInfo.objects.get(pk=pk)
  67. except BookInfo.DoesNotExist:
  68. return HttpResponse(status=404)
  69.  
  70. return JsonResponse({
  71. "id": book.id,
  72. "btitle": book.title,
  73. 'bpub_date': book.pub_date,
  74. 'bread': book.read,
  75. 'bcomment': book.comment,
  76. 'image': book.image.url if book.image else ''
  77. })
  78. def put(self,request,pk):
  79. """
  80. 修改图书信息
  81. 路由:PUT/books/<pk>/
  82. :param request:
  83. :param pk:
  84. :return:
  85. """
  86. try:
  87. book = BookInfo.objects.get(pk=pk)
  88. except BookInfo.DoesNotExist:
  89. return HttpResponse(status=404)
  90.  
  91. json_bytes = request.body
  92. json_str = json_bytes.decode()
  93. book_dict = json.loads(json_str)
  94.  
  95. ##########此处详细的校验参数省略#############
  96.  
  97. book.title = book_dict.get('btitle')
  98. book.pub_date = book_dict.get('bpub_date')
  99. book.save()
  100.  
  101. return JsonResponse({
  102. "id": book.id,
  103. "btitle": book.title,
  104. 'bpub_date': book.pub_date,
  105. 'bread': book.read,
  106. 'bcomment': book.comment,
  107. 'image': book.image.url if book.image else ''
  108. })
  109.  
  110. def delete(self,request,pk):
  111. """
  112. 删除图书
  113. 路由:DELETE/books/<pk>/
  114. :param request:
  115. :param pk:
  116. :return:
  117. """
  118. try:
  119. book = BookInfo.objects.get(pk=pk)
  120. except BookInfo.DoesNotExist:
  121. return HttpResponse(status=404)
  122. book.delete()
  123. return HttpResponse(status=204)

views.py

测试:

使用Postman软件测试接口

1、获取所有图书信息

GET方式访问http://127.0.0.1:8000/books/,返回状态码200以及json数据

2、获取单一的图书数据

GET 访问 http://127.0.0.1:8000/books/5/ ,返回状态码200以及json数据

3、新增书籍信息

POST访问http://127.0.0.1:8000/books/,发送json数据,返回json数据以及状态码

4、修改书籍数据

PUT访问http://127.0.0.1:8000/books/2/,发送json数据,返回json数据以及状态码

5、删除书籍数据

DELETE访问http://127.0.0.1:8000/books/2/,发送json数据,返回状态码204

2、明确REST接口开发的核心任务

在上面的案例中,在开发REST API接口时候,视图主要做的三件事:

  1、将请求的数据(如json格式)转化为模型类对象

  2、操作数据库(增删改查)

  3、将模型类对象转换为响应的数据(如json数据格式)

序列化(Serialization)

  就是将程序中的一个数据结构类型转化为其他格式(字典、json、XML等)。例如在Django中的模型类对象转换为JSON字符串,这就是序列化(json.dumps())

  反之,将其他数据字典、json、XML等)转化为程序的数据,例如将JSON字符串转换为Django中的模型类对象,这个过程就叫反序列化(json.load())

  在开发REST API时,视图中要频繁的进行序列化与反序列化。

总结:

  在开发REST API接口,在视图中需要做的核心就是:1、将数据库数据序列化(json.dumps())为前端所需要的格式,并返回。2、将前端发送的数据反序列化(json.load())为模型类对象,保存在数据库中。

Django REST  framework介绍:

  在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的。

  在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增、删、改、查的实现流程基本套路化,所以这部分代码也是可以复用简化编写的:

  1. 增:校验请求数据 -> 执行反序列化过程 -> 保存数据库 -> 将保存的对象序列化并返回
  2. 删:判断要删除的数据是否存在 -> 执行数据库删除
  3. 改:判断要修改的数据是否存在 -> 校验请求的数据 -> 执行反序列化过程 -> 保存数据库 -> 将保存的对象序列化并返回
  4. 查:查询数据库 -> 将数据序列化并返回

  Django REST framework可以帮助我们简化上述两部分的代码编写,大大提高REST API的开发速度。Django REST framework 框架是一个用于构建Web API 的强大而又灵活的工具。通常简称为DRF框架 或 REST framework。DRF框架是建立在Django框架基础之上,由Tom Christie大牛二次开发的开源项目。

特点

  • 提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
  • 提供了丰富的类视图、Mixin扩展类,简化视图的编写;
  • 丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
  • 多种身份认证和权限认证方式的支持;
  • 内置了限流系统;
  • 直观的 API web 界面;
  • 可扩展性,插件丰富

15-Django开发REST接口的更多相关文章

  1. python3.8.0 Django 开发后端接口api 部署到 Linux Centos7上

    经历了两天的时候终于把本地使用python3 django开发的接口API部署到服务器上了,还是记录一下,以免之后忘记,哈哈 注意一点,就是,centos7是基于python2的,我这边默认的是pyt ...

  2. django开发后台接口error 10053/10054

    初学Django,开发完接口之后访问post请求的接口遇到error10053和10054,查阅很多资料没有找到具体的原因. 在这里记录下我遇到这两个报错的原因和解决方案: get请求取请求参数:su ...

  3. 使用Django开发简单接口:文章增删改查

    目录 1.一些准备工作 安装django 创建django项目 创建博客应用(app) 2.models.py 3.django admin 登录 创建超级用户 4.修改urls.py 5.新增文章接 ...

  4. django开发最完美手机购物商城APP带前后端源码

    后端和数据接口,全采用django开发 从0到大神的进阶之路 一句话,放弃单文件引用vue.js练手的学习方式 马上从vue-cli4练手,要不然,学几年,你也不懂组件式开发,不懂VUEX,不懂路由, ...

  5. 04.开发REST 接口

    使用Django开发REST 接口 我们以在Django框架中使用的图书英雄案例来写一套支持图书数据增删改查的REST API接口,来理解REST API的开发. 在此案例中,前后端均发送JSON格式 ...

  6. 15款Django开发常用软件包(转)

    原文:http://www.iteye.com/news/28697 Django是一款高级的Python Web框架,可以帮助开发者快速创建web应用.我们这里整理了15款Django开发中常用的软 ...

  7. Django:前后端分离 djangorestframework开发API接口 serializer序列化认证组件

    参考:https://blog.csdn.net/zhangmengran/article/details/84887206 目的: 使用serializer序列化器将QuerySet数据序列化为js ...

  8. Django开发常用方法及面试题

    目录 1.对Django的认识? 2.Django .Flask.Tornado的对比 3.什么是wsgi,uwsgi,uWSGI? 4. django请求的生命周期? 5. 简述什么是FBV和CBV ...

  9. Django开发笔记之数据库的设计

    后台采用Django开发,可以体会到开发的便利之处,对于一个项目来说,首先最重要的是数据库的设计,那么在Django下数据库设计主要是如下步骤: 1,需求分析,这点子不用多说,而我也深刻体会到了没有原 ...

随机推荐

  1. Nginx日志常见时间变量解析

    $request_time 官方解释:request processing time in seconds with a milliseconds resolution; time elapsed b ...

  2. WASM 成为 HTML、CSS 与 JS 之后的第 4 门 Web 语言

    大家都知道,万维网联盟 W3C 认证的 Web 语言有 HTML.CSS 与 JavaScript,而近日联盟正式宣布 WebAssembly 核心规范(WebAssembly Core Specif ...

  3. C++ std::array 基本用法

    #include <iostream> #include <string> #include <array> using namespace std; // htt ...

  4. 邹传伟:对人民银行DC/EP的初步分析

    http://opinion.caixin.com/2019-11-01/101477903.html [财新网](专栏作家 邹传伟)2019年10月24日,习总书记在中央政治局第十八次集体学习中指出 ...

  5. opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH_OTSU使用

    cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下: #ret:暂时就认为是设定的thresh阈值,mask:二值化的图像 ret,mask = cv2.threshold(i ...

  6. 使用opencv和numpy实现矩阵相乘和按元素相乘 matrix multiplication vs element-wise multiplication

    本文首发于个人博客https://kezunlin.me/post/1e37a6/,欢迎阅读最新内容! opencv and numpy matrix multiplication vs elemen ...

  7. 如何优雅规避NPE

    项目中尤其是在持久层,难免会有大量的针对集合,对象,字符串的操作,为了程序的健壮性,我们不得不进行判空,像下面箭头式编码吗? if(null!=person){ ... if(null!=addres ...

  8. 创建多进程之multiprocess包中的process模块

    创建多进程之multiprocess包中的process模块 1.process模块是一个创建进程的模块 Process([group [, target [, name [, args [, kwa ...

  9. Android Fragment 隐藏或显示时调用的生命周期方法

    Fragment使用方式大体分两种: 大家要注意不同的Fragment使用方法,Fragment隐藏和显示调用的生命周期方法是不同的,以下是Fragment显示隐藏调用的方法: //判断是否展示—与V ...

  10. ef实现一次查询多个聚合函数的字段

    想用ef来写一个统计字段的语句,如下所示 select sum(price) as price_total, sum(amount) as amount_total from table1 发现似乎实 ...