drf请求与响应
1.request请求 :通过http请求,经过OSI协议,拿着前端提供的数据给了django,django把请求给了request的对象,drf又对request进行了一次封装,每次请求都是一个新的request对象,,所以request能够直接点data获取数据
http版本0.9
http1.1 现在基本都是用的这个版本 一个请求通道可以建立多次请求,不断开链接,当不再需要数据传输的时候才会断开连接
http2.0 多路复用 一次发送多条数据 一个请求通道 打包发送 接收
2.Request类的属性和方法
data 可以直接用request.data获取三种编码格式的数据 数据获取出来的是字典 通过Response变成字符串类型返回给前端
query_params 相当于django中的request.post 底层原理也是用__getattr__方法
3.Response类
主要的三个方法:
1.data=None 字典或者列表序列化成json格式字符串 返回给前端放在http响应的body中
2.status=None 状态码 可以直接写,也可用导入封装好的http响应状态码 导入模块即可 默认是200
3..headers=None http的响应头 以字典的k:v形式展示
4.template_name=None 在浏览器中看到好看的页面 有指定的模板也可以不加
5.content_type=None 响应的编码格式 默认是json类型
drf能够解析的请求编码格式
drf中的配置文件settings.py中有(默认的解析)DEFAULT_PARSER_CLASSES:
-'rest_framework.parsers.JSONParser', 可以解析json格式
-'rest_framework.parsers.FormParser', 可以解析urlencoded格式
-'rest_framework.parsers.MultiPartParser' 可以解析form-data格式
可以通过配置修改编码格式或者指定编码格式:
方式1:全局配置 在settings写:以上默认编码格式 不需要的直接注释掉
方式2:局部配置 在自己写的视图类中写:
class TestView(APIView):parser_classes = [JSONParser,FormParser,MultiPartParser]
总结
总结: 解析类的使用顺序:优先使用视图类自己的,然后是项目配置文件的,最后是内置文件的
实际在项目中基本都是使用JSONParser,FormParser
如果上传文件的话,只允许使用MultiPartParser
格式使用越少越能减少出错的概率
响应编码
默认情况下,响应编码是根据客户端类型决定的
分为全局配置:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.BrowsableAPIRenderer',
局部配置: 在视图类中配置
class TestView(APIView):renderer_classes = [JSONRenderer]
drf视图组件
视图基类 :APIView和GenericAPIView
基于APIView写五个接口
class BookView(APIView):
def get(self,request):
book_list = Book.objects.all()
ser = BookSerializers(instance=book_list,many=True)
return Response(ser.data)
class BookView(APIView):
def get(self,request,pk):
book = Book.objects.filter(pk=pk).first()
ser = BookSerializers(instance=book)
return Response(ser.data)
class BookView(APIView):
def post(self,request):
ser = BookSerializers(data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response(ser.errors)
class BookView(APIView):
def put(self,request,pk):
book = Book.objects.filter(pk=pk).first()
ser = BookSerializers(instance=book,data=request)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response(ser.errors)
class BookView(APIView):
def delete(self,request,pk):
Book.objects.filter(pk=pk).delete()
return Response('')
基于GenericAPIView写五个接口
class BookView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializers
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(ser.data)
else:
return Response(ser.errors)
class BookDetailView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializers
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(ser.data)
return Response(ser.errors)
def delete(self, request, pk):
self.get_queryset().filter(pk=pk).delete()
return Response()
基于面向对象封装
单方法封装
class Once():
def get(self, request, pk):
book = self.get_object()
ser = self.get_serializer(instance=book)
return Response(ser.data)
class More():
def get(self, request):
book_list = self.get_queryset()
ser = self.get_serializer(instance=book_list, many=True)
return Response(ser.data)
class Amend():
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(ser.data)
else:
return Response(ser.errors)
class Add():
def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response(ser.errors)
class Dle():
def delete(self, request, pk):
self.get_queryset().filter(pk=pk).delete()
return Response('')
基于单方法组合封装
class MoreAdd(GenericAPIView, More, Add):
def __init__(self):
super(More, self).__init__()
super(Add, self).__init__()
class OnceDleAmend(GenericAPIView, Once, Dle, Amend):
def __init__(self):
super(Once, self).__init__()
super(Dle, self).__init__()
super(Amend, self).__init__()
class DelAmend(GenericAPIView, Dle, Amend):
def __init__(self):
super(Dle, self).__init__()
super(Amend, self).__init__()
class CheckDle(GenericAPIView, Once, Dle):
def __init__(self):
super(Dle, self).__init__()
super(Once, self).__init__()
class AmendCheck(GenericAPIView, Amend, Once):
def __init__(self):
super(Amend, self).__init__()
super(Once, self).__init__()
组合封装的查询
class BookView(MoreAdd):
queryset = Book.objects.all()
serializer_class = BookSerializers
def __init__(self):
super(MoreAdd, self).__init__()
class BookDetailView(OnceDleAmend):
queryset = Book.objects.all()
serializer_class = BookSerializers
def __init__(self):
super(OnceDleAmend, self).__init__()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现