hello!我是小J,每天一个小知识,一起学python,让技术无限发散。
DRF和Web
- 1. web应用模式
- 2. 使用Django开发REST接口
- 3. DRF介绍和安装
- 结束语
1. web应用模式
1.1 前后端不分离
前后端不分离的应用模式中,前端代码和后端代码是在一块的,需要一个服务器就行,前端页面看到的效果是由后端控制,经后端渲染模板或重定向,后端控制着前端的展示,前后端的耦合度非常高。这种应用模式比较适合纯网页应用。但是当后端对接App时,App可能不需要后端返回一个html页面,而只需要接收数据本身,这样原本后端返回网页的接口不再适用于前端的App应用,为了实现对接App还需要再开发一套接口。
1.2 前后端分离
在前后端分离的应用模式中,前端代码和后端代码时分开的,需要两个服务器,后端仅仅返回前端所需要的数据,不再渲染HTML页面,也不再控制前端的效果。至于前端用户能看到什么效果,均是由后端请求的数据加载到前端中,由前端觉得,网页有网页的处理方式,App有App的处理方式。但是无论哪种前端,所需要的数据基本相同,后端仅仅需要开发一套逻辑对外提供数据即可。在前后端分离的应用模式中,前端和后端的耦合度相对较低,通常后端开发的每个视图都称为一个接口(API),前端通过访问接口来对数据进行增删改查。
2. 使用Django开发REST接口
在了解什么是REST之前,我们需要了解一下API和Web更有助于我们了解REST,因为REST是基于Web为平台的一种架构风格,在开发API时需要遵循的一种风格,当然也存在其他规则可用。
2.1 什么是REST
-
API 英文为Application Programming Interface,中文为应用程序编程接口,是一些预先定义的函数,目的是为了提供应用程序与开发人员基于某些软件或硬件可以访问一组例程的能力,而无需理解内部工作机制的细节或无需访问源码。就像平时大家可以将其他软件里的内容分享到微信朋友圈,这些软件就和微信的API进行了交互。
-
Web是分布式信息系统为超文本文件和其他对象提供访问的入口,资源(对象)是Web架构的关键点,存在3个操作:
所以REST,英文Resource Representational State Transfer的缩写,中文资源在网络中以某种表现形式进行状态转移就是选择通过http协议和uri,利用client/server model对资源进行增删改查操作。REST描述的是在网络中client和server的一种交互形式;REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口)。对于资源的具体操作类型,由HTTP动词表示。常用的HTTP动词有下面五个(括号里是对应的SQL命令):
2.2 REST的规范使用
2.2.1 查询数据
在视图函数中编写类来查询数据库,查询数据是把数据构造为字典用来响应给浏览器(前端)
# 用类的方式来查询数据库
from .models import PeopleInfo,BookInfo
class BookInfoView(View):
"""
列表数据
查询所有的图书数据
"""
def get(self,request):
# books = BookInfo.objects.all()
books = BookInfo.objects.filter(is_delete=False)
print(books)
book_list = []
for book in books:
book_dict = {
'id':book.id,
'name':book.name,
'pub_date':book.pub_date,
'readcount':book.readcount,
'commentcount':book.commentcount,
'image':book.image.url if book.image else ''
}
book_list.append(book_dict)
print(book_list)
return JsonResponse(book_list,safe=False)
路由:path('book/',views.BookInfoView.as_view()),
结果:
2.2.2 添加数据
使用post方法添加数据,获取数据,把数据进行转换为字典,构造响应的数据给浏览器(前端)
# 用类的方式来查询数据库
class BookInfoView(View):
"""
列表数据
查询所有的图书数据
"""
def get(self,request):
# books = BookInfo.objects.all()
books = BookInfo.objects.filter(is_delete=False)
print(books)
book_list = []
for book in books:
book_dict = {
'id':book.id,
'name':book.name,
'pub_date':book.pub_date,
'readcount':book.readcount,
'commentcount':book.commentcount,
'image':book.image.url if book.image else ''
}
book_list.append(book_dict)
print(book_list)
return JsonResponse(book_list,safe=False)
def post(self,request):
"""
添加数据
:param request:
:return:
"""
# 获取到修改的数据
# print(request)
json_bytes = request.body
# 转换为字符串
json_str = json_bytes.decode()
# 转换为字典
import json
book_dict = json.loads(json_str)
print(book_dict)
# 保存数据
book = BookInfo.objects.create(
name = book_dict['name'],
pub_date = book_dict['pub_date']
)
book_dict = {
'id': book.id,
'name': book.name,
'pub_date': book.pub_date,
'readcount': book.readcount,
'commentcount': book.commentcount,
'image': book.image.url if book.image else ''
}
return JsonResponse(book_dict)
结果:
2.2.3 删除、修改数据
修改数据流程:
- ①获取要修改的数据,转换为字典
- ②查询一下要修改的数据是否存在
- ③存在数据就修改,并保存
- ④响应
删除数据流程:获取删除的数据,去和数据库进行对比,如果有这个数据就删除,把删除的结果返回给浏览器
# 修改指定的数据
class BookDetailView(View):
# 获取指定的数据
def get(self,request,pk):
# 查询这个ID对应的数据是否存在
try:
book = BookInfo.objects.get(id=pk)
except Exception as e:
return JsonResponse({'message':'error:%s'%e},status=404)
book_dict = {
'id': book.id,
'name': book.name,
'pub_date': book.pub_date,
'readcount': book.readcount,
'commentcount': book.commentcount,
'image': book.image.url if book.image else ' '
}
return JsonResponse(book_dict)
# 删除数据
def delete(self,request,pk):
try:
book = BookInfo.objects.get(id=pk)
except Exception as e:
return JsonResponse({'message':'error:%s'%e},status=404)
book.delete()
return JsonResponse({'message':'delete success'},status=204)
def put(self,request,pk):
"""
修改指定的某个图书数据
"""
try:
book = BookInfo.objects.get(id=pk)
except Exception as e:
return JsonResponse({'message':'error:%s'%e},status=404)
# 获取传过来的数据
json_bytes = request.body
print(json_bytes)
# 转换为字符串
json_str = json_bytes.decode()
# 转换为字典
import