学习DRF框架,首先我们就需要明白为什么要学习这个框架。

接下来我们就先用原生的Django框架来定义一个符合RESTful设计方法的接口(API)。

RESTful接口的需求如下:

GET     /books/         查询所有图书信息
POST /books/ 新增图书信息
GET /books/<pk>/ 查询指定id的图书信息
PUT /books/<pk>/ 修改指定id的图书信息
DELETE /books/<pk>/ 删除指定id的图书信息
响应数据 JSON

1. 定义查询所有图书信息的接口:

class BooksInfoView(View):
'''查询所有图书信息,新增图书信息'''
def get(self, request):
'''
查询所有图书信息
:return:JSON
''' # 查询所有图书模型:查询集
book_model_list = BookInfo.objects.all() # 构造JSON数据
book_list = []
for book in book_model_list:
book_dict = {
'id': book.id,
'btitle': book.btitle,
'bpub_date': book.bpub_date,
'bread': book.bread,
'bcomment': book.bcomment,
}
book_list.append(book_dict) # 响应JSON
# JsonResponse传递字典列表时,需要指定safe=False
return http.JsonResponse(book_list, safe=False)

2. 定义添加图书信息的接口:

因为,添加图书信息的路由和查询图书信息的路由一致,所以可以代码复用,直接在上一个视图中定义与请求方式同名的方法即可。

def post(self, request):
'''
新增图书信息
:return: JSON
'''
# 获取前端传递的数据
json_dict = json.loads(request.body.decode()) # 省略校验步骤 # 核心逻辑:将数据保存到数据库中
book = BookInfo.objects.create(
btitle = json_dict.get('btitle'),
bpub_date = json_dict.get('bpub_date'),
bread = json_dict.get('bread'),
bcomment = json_dict.get('bcomment')
) # 构造响应数据
book_dict = {
'id': book.id,
'btitle': book.btitle,
'bpub_date': book.bpub_date,
'bread': book.bread,
'bcomment': book.bcomment,
} # 响应JSON
# RESTful设计模式要求:增加后的数据需要返回给前端,并且响应status=201
return http.JsonResponse(book_dict, status=201)

这里要注意,RESTful设计方法中要求添加和修改后的数据必须返回给前端,并且响应状态码为201.

3. 定义查询指定id的图书信息接口:

class BookInfoView(View):
'''查询、修改、删除指定id的图书信息''' def get(self, request, pk):
'''
查询指定id的图书信息
:param pk: 指定的图书id
:return: JSON
'''
try:
# 查询图书信息
book = BookInfo.objects.get(id=pk)
except BookInfo.DoesNotExist:
return http.HttpResponseNotFound() # 构造JSON数据
book_dict = {
'id': book.id,
'btitle': book.btitle,
'bpub_date': book.bpub_date,
'bread': book.bread,
'bcomment': book.bcomment,
} # 响应JSON
return http.JsonResponse(book_dict)

因为,修改、删除指定id的图书信息,路由地址与查询指定id的图书信息一致,所以可以进行接口定义代码的复用。

def put(self, request, pk):
'''
修改指定id的图书信息
:param pk: 指定的图书id
:return: JSON
''' # 接受前端传递的数据
json_dict = json.loads(request.body.decode())
btitle = json_dict.get('btitle')
bpub_date = json_dict.get('bpub_date')
bread = json_dict.get('bread')
bcomment = json_dict.get('bcomment') # 省略校验 try:
# 查询图书信息
book = BookInfo.objects.get(id=pk)
except BookInfo.DoesNotExist:
return http.HttpResponseNotFound() # 核心逻辑:将新值覆盖旧值
book.btitle = btitle
book.bpub_date = bpub_date
book.bread = bread
book.bcomment = bcomment
book.save() # 构造JSON数据
book_dict = {
'id': book.id,
'btitle': book.btitle,
'bpub_date': book.bpub_date,
'bread': book.bread,
'bcomment': book.bcomment
} # 响应JSON
# 在RESTful设计风格中,要求返回后端修改后的数据,并响应status=201
return http.JsonResponse(book_dict, status=201) def delete(self, request, pk):
'''
删除指定id的图书信息
:param pk: 指定的图书id
:return: JSON
''' try:
# 查询图书信息
book = BookInfo.objects.get(id=pk)
except BookInfo.DoesNotExist:
return http.HttpResponseNotFound() # 核心逻辑:删除数据
book.delete() # 响应http:RESTful设计风格,要求删除数据响应http且status=204
return http.HttpResponse(status=204)

到此,我们就完成了使用原生的Django框架结合RESTful设计方法定义的接口(API)。

我们,可以发现我们进行了多次序列化与反序列化(获取JOSN数据、构造JSON数据)的代码的编写,造成了大量的代码冗余,极大地降低了我们开发的效率。

然而,DRF框架(Django REST framework)序列化与反序列化的操作进行了高度的封装,使用DRF框架可以极大提升我们日常的工作效率。

工作效率高了,老板高兴了,给你发奖了,你也高兴了。

这也就是我们为什么要学习DRF框架的原因。

DRF框架之使用Django框架完成后端接口(API)的定义的更多相关文章

  1. Vue学习笔记-Django REST framework3后端接口API学习

    一  使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7  (Windows x86- ...

  2. 自创Web框架之过度Django框架

    目录 自创Web框架之过度Django框架 软件开发架构 HTTP协议 Web框架之"撸起袖子加油干" Web框架之通过wsgiref加油干 封装优化处理 动静网页 jinjia2 ...

  3. python主流框架简介和Django框架的使用

    目录 一.手撸简易web框架 二.动静态网页 1. 静态网页 2. 动态网页 三.jinja2模板语法 1. jinja2的作用 四.python主流web框架 1. django 3. tornad ...

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

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

  5. Pyhton-Web框架之【Django】

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

  6. Django框架01 / http协议、web框架本质

    Django框架01 / http协议.web框架本质 目录 Django框架01 / http协议.web框架本质 1.http协议 1.1 http协议简介 1.2 什么是http协议 1.3 H ...

  7. 第三百零三节,Django框架介绍——用pycharm创建Django项目

    Django框架介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内 ...

  8. 一 Django框架介绍——用pycharm创建Django项目

    Django框架介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内 ...

  9. Django框架——基础教程(总)

    1. Django简介 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是一个开放源代码的Web应用框架 ...

随机推荐

  1. 超简单!pytorch入门教程(二):Autograd

    一.autograd自动微分 autograd是专门为了BP算法设计的,所以这autograd只对输出值为标量的有用,因为损失函数的输出是一个标量.如果y是一个向量,那么backward()函数就会失 ...

  2. Python3 批量修改JPG图片尺寸

    功能 批量修改当前文件夹下的jpg图片到设置的尺寸 将修改后的图片移动到 new_img 这个文件夹下 导入库 from PIL import Image # 处理图片模块 import os imp ...

  3. 利用Feed43为网站自制RSS源

    什么是RSS,它可以做什么 快2020年了,RSS日渐式微,我也是去年机缘巧合下才开始使用的,以前只是听说过.RSS,全称Really Simple Syndication,又称简易信息聚合(也叫聚合 ...

  4. 【他山之石】jenkins忘记初始化密码解决办法

    没有太好的方式,网上有的是这样子的,找到 /var/lib/jenkins/users/username/config.xml, 修改为一个已知的 hash 值 #jbcrypt:$2a$10$Dda ...

  5. Excel解除'工作表保护密码',并复原密码设定

    前提要求 Office 2003(也就是老版的.xls文件) 用到宏操作 可以解除[审阅->保护工作表]的密码保护,其他的密码保护不能处理. 解决方案 打开需解除保护密码的Excel文件(.xl ...

  6. 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$

    正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...

  7. CommandPattern(命令模式)-----Java/.Net

    命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该 ...

  8. CSS3(4)---动画(animation)

    CSS3(4)---动画(animation) 之前有写过过渡:CSS3(2)--- 过渡(transition) 个人理解两者不同点在于 过渡 只能指定属性的 开始值 与 结束值,然后在这两个属性值 ...

  9. 小小知识点(十四)——Adobe photoshop cc 2018中简单抠图的一些基本操作

    一 如何抠图 1. 右键弹出选择工具,随后鼠标左键选择快速选择工具 2.通过点击鼠标,选择想要的区域: Alt+鼠标右键  左右拖动鼠标可调整画笔大小 Alt+鼠标滑轮,可放大或缩小画布大小 ctrl ...

  10. 高斯消去法解线性方程组(MPI)

    用一上午的时间,用MPI编写了高斯消去法解线性方程组.这次只是针对单线程负责一个线程方程的求解,对于超大规模的方程组,需要按行分块,后面会在这个基础上进行修改.总结一下这次遇到的问题: (1)MPI_ ...