这里写目录标题
##9.1 基本概念##
9.1.1 什么是前后端分离
- 前端:浏览器
以炫酷、流畅、兼容为主
- 后端:服务器
三高: 高并发、高可用、高性能
不分离
用户在浏览器上发送请求,服务器端接收到请求,从数据库取出数据,处理后将结果数据填入 HTML 模板,返回给浏览器,浏览器将 HTML 展现给用户,不分离的核心就是模版
分离
数据渲染的工作在客户端浏览器,不需要服务端完成,服务端专注于提供数据
那么这就要求Django框架不需要返回一个模版页面,而是返回一套JSON数据,而由于JSON可以在多种语言中支持,是一种交互、兼容非常合适的语言格式,所以现在后台常返回的数据都为JSON格式的,这个过程也称作序列化
9.1.2 什么是restful风格
在前后端分离的应用模式里,API接口如何定义?
POST /add-goods
增加商品POST /delete-goods
删除商品POST /update-goods
修改商品GET /get-goods
查询商品信息
使用合理的请求方式
- GET:获取数据
- POST:提交数据,创建数据
- PUT:提交数据,更新数据
- DELETE:删除数据
使用合理的状态码
接口返回数据,还要带上合理的状态码进行标记
200 OK - [GET] # 服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH] # 用户新建或修改数据成功。
202 Accepted - [*] # 表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE] # 用户删除数据成功。
9.1.3 什么是接口及接口文档
API接口文档一般分为接口描述、接口地址、请求方法、请求参数、响应内容、错误代码、实例
9.2 DRF工程
9.2.1 drf工程搭建
安装DRF框架
pip install djangorestframework -i
https://pypi.tuna.tsinghua.edu.cn/simple
配置 settings
INSTALLED_APPS = [
...
'rest_framework', # 配置DRF框架
]
9.2.2 drf官方文档导读
- 将请求的数据转换为模型类对象 反序列化
- 操作数据库
- 将模型类对象转换为响应的数据如JSON格式 序列化
- 视图封装:DRF统一封装了请求的数据为request.data以及返回数据的Response方法
- 序列化器:DRF提供了序列化器可以统一便捷的进行序列化及反序列化工作
9.3 APIView
9.3.1 APIView处理Request
.data
DRF将request.POST、request.FILES的数据统一封装到了data属性中,其中包含了
- 解析之后的文件、非文件数据
- 对POST、PUT、PATCH请求方式解析后的数据
- 表单类型数据、JSON类型数据
from rest_framework.views import APIVie
from rest_framework.response import Response
class MyView(APIView):
def post(self,request):
# request.data.get('id')
print(request.data)
return Response({'msg': 'success'}, status=201)
.query_params
DRF为了更准确的表示这是从连接里取得数据,从而把request.GET的名字更换为了request.query_params,其余操作与request.GET一样,这里只是拼写更换
from rest_framework.views import APIVie
from rest_framework.response import Response
class MyView(APIView):
def get(self,request):
# request.query_params.get('id')
print(request.query_params) # get 的连接传参
return Response({'msg': 'success'}, status=200)
9.3.2 视图的Response及json处理
目前在DRF中,我们所使用最多的就是Response这个方法,经常使用已经序列化好的数据结合Response返回
9.4 序列化
9.4.1 什么是JSON
这一种在各个编程语言中流通的数据格式,可以在不同的编程语言中的进行数据传递和交互
也就是用JSON传输数据可以让不同语言之间可以跨越语言不同的鸿沟,虽然 python 无法和 js 进行通信,但是通过JSON,就可以让两者进行数据通信
9.4.2 什么是序列化
序列化:就是把模型层的数据返回为JSON**数据集
反序列化:就是把前端发来的JSON**数据,类字典数据,变为模型层的数据
9.4.4 DRF的序列化器
在根目录下创建serializers
文件写
# DRF的序列化器文件
# 创建自己的序列化器---写模型类一样
from rest_framework import serializers
# 普通序列化器
# 定义序列化器的名字
class PeopleSerializer(serializers.Serializer):
# 模型类有哪些字段就序列化哪些字段
# id = serializers.IntegerField()
name =serializers.CharField(max_length=20)
sex =serializers.CharField(max_length=20)
money =serializers.IntegerField()
ranking =serializers.IntegerField()
1.增删查改对应几个操作?
5个,增加一个数据post,删除一个数据delete,查询所有数据get,查询一个数据get,修改一个数据put。
2.那些操作需要参数,那些操作不需要参数?
不需要参数: 增加一个数据post,查询所有数据get 静态路由
需要参数:删除一个数据delete,查询一个数据get,修改一个数据put 带id的动态路由
3.需要设计几个类视图实现?
2个
知识点:
1.普通序列化器 和 模型序列化器
2.序列化器的使用,怎么进行增删查改。
3.增删查改序列化对应哪些操作,反序列化对应的哪些操作
序列化:查
反序列化:增、改
删除都不是
在后端实现增删改查操作
在views
中实现
from django.shortcuts import render
# 导入 APIView导包
from rest_framework.views import APIView
# 导入视图 Response
from rest_framework.response import Response
# 导入模型类 People
from myapp.models import People
# 导入普通序列化器
from myapp.serializers import PeopleSerializer,PeopleSerializer2
# Create your views here.
class PeopleView(APIView):
# # 查询所有名人信息
# def get(self,request):
# people = People.objects.all()
# people_list = [] # 手动完成序列化的过程
# for peo in people: # 将这个数据做一个重组
# people_dict = {
# 'name': peo.name,
# 'sex': peo.sex,
# 'money': peo.money,
# 'ranking': peo.ranking
# }
# people_list.append(people_dict)
# return Response(people_list, status=200)
# 使用序列化器
# 展示数据
def get(self,request):
people = People.objects.all()
# people 是要序列化的数据,many=True多个数据
# 使用序列化器对数据进行序列化
ser = PeopleSerializer(people, many=True) # 序列化
# 注意:返回响应返回的是.data字段
return Response(ser.data, status=200)
# 增加一个信息 是反序列化 json数据->ORM格式数据
def post(self,request):
# 使用序列化器进行反序列化
ser = PeopleSerializer(data=request.data)
# 判断反序列化是否成功
# raise_exception=True 如果出现异常,会抛出异常
if ser.is_valid(raise_exception=True):
# 保存
ser.save()
# 201添加 或者 修改成功
return Response({'msg': 'success'}, status=201)
# 返回失败
return Response({'msg': 'error'}, status=400)
class PeopleView2(APIView):
# 查询一个信息
def get(self, request, id):
try:
peo_data = People.objects.get(id=id)
except Exception as e:
print(e)
# 404 数据不存在
return Response({'msg': 'error'}, status=404)
# 对ORM操作查询到的数据进行 序列化
ser = PeopleSerializer(instance=peo_data)
return Response(ser.data, status=200)
# 修改一个信息
def put(self, request, id):
try:
peo_data = People.objects.get(id=id)
except Exception as e:
print(e)
# 404 数据不存在
return Response({'msg': 'error'}, status=404)
# 对要更新的数据进行 反序列化
# instance=peo_data,要修改的ORM对象(实例)
# data=request.data, 用于修改ORM对象的数据
ser = PeopleSerializer(instance=peo_data,data=request.data)
# 判断反序列化是否成功
if ser.is_valid(raise_exception=True):
# 保存
ser.save()
# 201 添加/修改 成功
return Response({'msg': 'success'}, status=201)
return Response({'msg': 'error'}, status=500)
# 删除一个信息
def delete(self, request, id):
try:
People.objects.filter(id=id).delete()
except Exception as e:
print(e)
# 404 数据不存在
return Response({'msg': 'error'}, status=404)
# 204 删除成功
return Response({'msg': 'success'}, status=204)
在serializers
中实现普通序列化器
# DRF的序列化器文件
from rest_framework import serializers
# 把模型类导入进来
from myapp.models import People
# 普通序列化器
# 定义序列化器的名字
class PeopleSerializer(serializers.Serializer):
# 模型类有哪些字段就序列化哪些字段
# id = serializers.IntegerField()
name =serializers.CharField(max_length=20)
sex =serializers.CharField(max_length=20)
money =serializers.IntegerField()
ranking =serializers.IntegerField()
# 新增数据会调用create方法
def create(self, validated_data):
obj = People.objects.create(
# ** 对 validated_data 做一个拆包操作
**validated_data
)
# 或
# People.objects.create(
# name=validated_data.get('name'),
# sex = validated_data.get('sex'),
# money = validated_data.get('money'),
# ranking = validated_data.get('ranking'),
# )
# 返回新生成的ORM对象
return obj
# 修改数据需要实现update方法
# instance,要修改的ORM对象(实例)
# validated_data, 用于修改ORM对象的数据
def update(self, instance, validated_data):
instance.name = validated_data.get('name')
instance.sex = validated_data.get('sex')
instance.money = validated_data.get('money')
instance.ranking = validated_data.get('ranking')
instance.save()
# 返回修改后的ORM对象
return instance