9.29内容整理和概述
今日内容概要
内容目录
- drf之请求
- drf之响应
- drf之GenericAPIView类
- drf之GenericAPIView类的示例
- 战略补充
drf之请求
'--------Request类----------'
属性/方法: # 常用
1.data:返回解析之后的实体数据
特性:
1.包含解析之后的文件和非文件数据
2.包含POST、PUT、PATCH请求方式解析后的数据 # 在原生djagno中put提交的数据在request.POST中是取不到的
3.支持表单数据和json类型数据
2.query_params:获取解析之后get请求的数据 # 和原生django的request.get功能相同,只是换了名字,更符合restful规范
3.其他原生request类方法和属性
'--------请求编码----------'
默认drf能解析的请求编码: # 在drf的settings.py文件中的DEFAULT_PARSER_CLASSES参数默认配置的
1.urlencoded
2.form-data
3.json
DEFAULT_PARSER_CLASSES参数:
1.rest_framework.parsers.JSONParser:可以解析json格式
2.rest_framework.parsers.FormParser:可以解析urlencoded格式
3.rest_framework.parsers.MultiPartParser:可以解析form-data格式
自定义请求编码方法:
方法一:全局配置
步骤:
1.在自己的项目app的settings.py文件创建REST_FRAMEWORK属性 # REST_FRAMEWORK负责drf所有的配置
2.在REST_FRAMEWORK导入DEFAULT_PARSER_CLASSES参数
3.在DEFAULT_PARSER_CLASSES参数中编辑需要的请求编码
例子:
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
# 'rest_framework.parsers.FormParser',
# 'rest_framework.parsers.MultiPartParser',
],
}
方法二:局部配置
步骤:
1.直接在视图类中编辑parser_classes属性,该属性的数据类型为列表
2.parser_classes属性中有JSONParser,FormParser,MultiPartParser # 需要导包(from rest_framework.parsers import JSONParser,FormParser,MultiPartParser)
例子:
from rest_framework.parsers import JSONParser,FormParser,MultiPartParser
class TestView(APIView):
parser_classes = [JSONParser,FormParser,MultiPartParser]
实际项目运用:
1.基本功能:JSONParser,FormParser
2.文件上传:MultiPartParser
解析请求编码的顺序:视图类-->项目配置文件-->drf内置配置文件
drf之响应
'--------Response类----------'
参数:
1.data:将该参数对应的数据序列化成json格式字符串,返回给前端 # 序列化数据放在http响应的body里
2.status:设置响应的状态码 # 默认为200
drf响应状态码:drf将所有的http响应状态码都封装成了常量,导包使用 # 为了更符合restful规范
3.headers:将该参数对应的字典类数据添加到响应头里
原生django向响应头添加数据: # 老刘讲得有点糊
1.序列化数据
2.将数据放在HttpResponse方法中并返回 # 例子:res=HttpResponse(d)
3.返回数据为字典类型,添加响应头增加的数据 # 例子:res['rrr'] = 'yyyy'
4.在将返回数据return出去 # 例子: return res
4.template_name:指定自定义返回模板 # 了解
5.content_type:指定Response的编码格式
'--------响应编码----------'
默认drf能解析的响应编码: # 在drf的settings.py文件中的DEFAULT_RENDERER_CLASSES参数默认配置的
1.json格式
2.浏览器的格式
DEFAULT_RENDERER_CLASSES参数:
1.rest_framework.renderers.JSONRenderer:可以解析json格式
2.rest_framework.renderers.BrowsableAPIRenderer:可以解析浏览器的格式
自定义响应编码方法:
方法一:全局配置
步骤:
1.在自己的项目app的settings.py文件创建REST_FRAMEWORK属性
2.在REST_FRAMEWORK导入DEFAULT_RENDERER_CLASSES参数
3.在DEFAULT_RENDERER_CLASSES参数中编辑需要的响应编码
例子:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
# 'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer'
],
}
方法二:局部配置
步骤:
1.直接在视图类中编辑renderer_classes属性,该属性的数据类型为列表
2.renderer_classes属性中有JSONRenderer,BrowsableAPIRenderer # 需要导包(from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer)
例子:
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class TestView(APIView):
renderer_classes = [JSONRenderer,BrowsableAPIRenderer]
实际项目运用:响应编码一般不配置,用默认配置
drf之GenericAPIView类
作用:做中间封装类,后期还有封装度更高的类,此类为基石 # 自己理解
GenericAPIView继承类:APIView类(父类)
属性:
1.queryset:定义当前要被序列化的数据体
2.serializer_class:定义对应的序列化类
3.lookup_field:规定了get_object()方法(查询单个对象)需要的条件字段 # 默认为pk
4.filter_backends:过滤类
5.pagination_class:分页类
方法:
1.get_object:根据pk获取单个数据 # 例子:book = self.get_object()
2.get_queryset:获取所有要序列化数据 # 例子:book_list = self.get_queryset()
3.get_serializer:获取要使用的序列化类 # 例子:ser = self.get_serializer(instance=book_list, many=True)
4.get_serializer_class:获取要使用的序列化类 # 需要多写一个括号,不推荐;例子:ser = self.get_serializer_class()(instance=book_list, many=True)
drf之GenericAPIView类的示例
from rest_framework.generics import GenericAPIView
class UserView(GenericAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
def get(self, request):
book_list = self.get_queryset()
ser = self.get_serializer(instance=book_list, many=True)
return Response(ser.data)
def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "新增成功"}, status=201)
else:
return Response({'code': 101, 'msg': ser.errors})
class UserDetailView(GenericAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
def get(self, request, pk):
book = self.get_object()
ser = self.get_serializer(instance=book)
return Response(ser.data)
def put(self, request, pk):
book = self.get_object()
ser = self.get_serializer(instance=book, data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "修改成功"}, status=201)
else:
return Response({'code': 101, 'msg': ser.errors})
def delete(self, request, pk):
self.get_queryset().filter(pk=pk).delete()
return Response('')
战略补充(字典setdefault方法)
字典setdefault方法:
例子:res = dict.setdefault("age",18)
功能:
1.当字典中setdefault携带的key值存在时,返回对应的value值给接收变量
2.当字典中setdefault携带的key值不存在时,返回setdefault携带的value值给接收变量