15-Django开发REST接口
使用Django开发REST接口
我们以在Django框架中使用的图书以及书中人物案例来写一套支持图书数据增删改查的REST API接口,来理解REST API的开发(前后端均发送JSON格式数据)
路由代码(urls.py):
urlpatterns = [
path('books/', views.BookListView.as_view()),
re_path('books/(?P<pk>\d+)/', views.BookDetailView.as_view())
]
views.py:
from datetime import datetime
from django.http import JsonResponse,HttpResponse
import json class BookListView(View):
"""
查询所有的书籍、增加书籍
"""
def get(self,request):
"""
查询所有的书籍,
路由:GET /books/
:param request:
:return:
"""
queryset = BookInfo.objects.all()
book_list = []
for book in queryset:
book_list.append({
"id":book.id,
"btitle":book.title,
"bpub_date":book.pub_date,
"bread":book.read,
"bcommet":book.comment,
"image":book.image.url if book.image else ""
})
#为了不使字典的数据发送,将参数safe变为False
return JsonResponse(book_list,safe=False) def post(self,request):
"""
新增书籍
路由:POST/books/
:param request:
:return:
"""
json_bytes = request.body
json_str = json_bytes.decode()
#将字符串对象反序列化
book_dict = json.loads(json_str)
################################
book = BookInfo.objects.create(
title = book_dict.get("btitle"),
pub_date = book_dict.get("bpub_date")
#.....................省略其他参数
)
#返回插入的数据,以json格式返回,并且带上状态码
return JsonResponse({
"id":book.id,
"btitle":book.title,
'bpub_date': book.pub_date,
'bread': book.read,
'bcomment': book.comment,
'image': book.image.url if book.image else ''
},status=201)
class BookDetailView(View):
def get(self,request,pk):
"""
获取单个图书信息
路由:GET/books/<pk>/
:param request:
:param pk:
:return:
"""
try:
book = BookInfo.objects.get(pk=pk)
except BookInfo.DoesNotExist:
return HttpResponse(status=404) return JsonResponse({
"id": book.id,
"btitle": book.title,
'bpub_date': book.pub_date,
'bread': book.read,
'bcomment': book.comment,
'image': book.image.url if book.image else ''
})
def put(self,request,pk):
"""
修改图书信息
路由:PUT/books/<pk>/
:param request:
:param pk:
:return:
"""
try:
book = BookInfo.objects.get(pk=pk)
except BookInfo.DoesNotExist:
return HttpResponse(status=404) json_bytes = request.body
json_str = json_bytes.decode()
book_dict = json.loads(json_str) ##########此处详细的校验参数省略############# book.title = book_dict.get('btitle')
book.pub_date = book_dict.get('bpub_date')
book.save() return JsonResponse({
"id": book.id,
"btitle": book.title,
'bpub_date': book.pub_date,
'bread': book.read,
'bcomment': book.comment,
'image': book.image.url if book.image else ''
}) def delete(self,request,pk):
"""
删除图书
路由:DELETE/books/<pk>/
:param request:
:param pk:
:return:
"""
try:
book = BookInfo.objects.get(pk=pk)
except BookInfo.DoesNotExist:
return HttpResponse(status=404)
book.delete()
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的视图中,虽然每个视图具体操作的数据不同,但增、删、改、查的实现流程基本套路化,所以这部分代码也是可以复用简化编写的:
- 增:校验请求数据 -> 执行反序列化过程 -> 保存数据库 -> 将保存的对象序列化并返回
- 删:判断要删除的数据是否存在 -> 执行数据库删除
- 改:判断要修改的数据是否存在 -> 校验请求的数据 -> 执行反序列化过程 -> 保存数据库 -> 将保存的对象序列化并返回
- 查:查询数据库 -> 将数据序列化并返回
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接口的更多相关文章
- python3.8.0 Django 开发后端接口api 部署到 Linux Centos7上
经历了两天的时候终于把本地使用python3 django开发的接口API部署到服务器上了,还是记录一下,以免之后忘记,哈哈 注意一点,就是,centos7是基于python2的,我这边默认的是pyt ...
- django开发后台接口error 10053/10054
初学Django,开发完接口之后访问post请求的接口遇到error10053和10054,查阅很多资料没有找到具体的原因. 在这里记录下我遇到这两个报错的原因和解决方案: get请求取请求参数:su ...
- 使用Django开发简单接口:文章增删改查
目录 1.一些准备工作 安装django 创建django项目 创建博客应用(app) 2.models.py 3.django admin 登录 创建超级用户 4.修改urls.py 5.新增文章接 ...
- django开发最完美手机购物商城APP带前后端源码
后端和数据接口,全采用django开发 从0到大神的进阶之路 一句话,放弃单文件引用vue.js练手的学习方式 马上从vue-cli4练手,要不然,学几年,你也不懂组件式开发,不懂VUEX,不懂路由, ...
- 04.开发REST 接口
使用Django开发REST 接口 我们以在Django框架中使用的图书英雄案例来写一套支持图书数据增删改查的REST API接口,来理解REST API的开发. 在此案例中,前后端均发送JSON格式 ...
- 15款Django开发常用软件包(转)
原文:http://www.iteye.com/news/28697 Django是一款高级的Python Web框架,可以帮助开发者快速创建web应用.我们这里整理了15款Django开发中常用的软 ...
- Django:前后端分离 djangorestframework开发API接口 serializer序列化认证组件
参考:https://blog.csdn.net/zhangmengran/article/details/84887206 目的: 使用serializer序列化器将QuerySet数据序列化为js ...
- Django开发常用方法及面试题
目录 1.对Django的认识? 2.Django .Flask.Tornado的对比 3.什么是wsgi,uwsgi,uWSGI? 4. django请求的生命周期? 5. 简述什么是FBV和CBV ...
- Django开发笔记之数据库的设计
后台采用Django开发,可以体会到开发的便利之处,对于一个项目来说,首先最重要的是数据库的设计,那么在Django下数据库设计主要是如下步骤: 1,需求分析,这点子不用多说,而我也深刻体会到了没有原 ...
随机推荐
- December 07th, Week 49th Saturday, 2019
Snowflakes are pretty patterns etched in water's dreams. 雪花,是水在梦中镌刻的美丽图案. From Anthony T.Hincks. Tod ...
- 20182320《Program Design and Data Structures》Learning Summary Week9
20182320<Program Design and Data Structures>Learning Summary Week9 1.Summary of Textbook's Con ...
- java基础 - 泛型的使用
泛型的使用方式有泛型类,泛型接口,泛型方法. 泛型的意思是把参数类型也当成参数传入,也就是在使用时(类实例化或调用方法时)传入类型. 泛型类 在实例化时传入参数类型,不能对泛型类使用instancec ...
- 大数据基础--R语言(刘鹏《大数据》课后习题答案)
1.R语言是解释性语言还是编译性语言? 解释性语言 2.简述R语言的基本功能. R语言是一套完整的数据处理.计算和制图软件系统,主要包括以下功能: (1)数据存储和处理功能,丰富的数据读取与存 ...
- celery配置
celery配置 celery的官方文档其实相对还是写的很不错的.但是在一些深层次的使用上面却显得杂乱甚至就没有某些方面的介绍, 通过我的一个测试环境的settings.py来说明一些使用celery ...
- 剑指Offer-42.和为S的两个数字(C++/Java)
题目: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 分析: ...
- Java连载55-接口的作用、接口举例
一.接口的作用 1.可以使项目分层,所有层都面向接口开发,开发效率提高了. 2.接口使代码和代码之间的耦合度降低,就像内存条和主板的关系,变得“可插拔”,可以随意切换. 总结:接口和抽象类能够完成某 ...
- 小程序 if else
与js略有差异 (1).js中的数据 (2) .wxml 中的数据判断 (3)结果显示
- Microsemi Libero系列教程(一)——Libero开发环境介绍、下载、安装与注册
前言 相比与Xilinx和Altera在国内的市场,Microsemi的FPGA在国内应用很少很少,网上几乎没有详细的教程,刚开始使用时,遇到了各种问题,自己也走了不少弯路.本系列教程以Libero ...
- 【HNOI 2017】礼物
Problem Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个装饰物,并且每个装饰物 ...