-
drf请求与响应
-
Request类(请求)
-
Response类(响应)
-
-
drf 能够解析的请求编码,响应编码
-
能够解析的请求编码
-
响应编码
-
-
GenericAPIView和APIView(2个视图基类)
-
GenericAPIView
-
drf请求与相应
Request类(请求)
from rest_framework.request import Request
在drf中我们所写在视图中的request不再是之前django原生的request,而是drf供的扩展了HttpRequest类的Request类的对象。
在APIView中的dispatch方法执行这一句后,视图中的request就不再是之前的request了
request = self.initialize_request(request, *args, **kwargs)
self.request = request
1. Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。
2. 无论前端发送的哪种格式的数据,我们都可以以统一的方式读取数据
Request类常用属性
1. data
POST, PUT, PATCH 请求方式解析后的数据
-原生djagno,put提交的数据在request.POST中是取不到的(要在request.body中才能取到)
2. -query_params
request.query_params
与Django标准的request.GET
相同,只是更换了更正确的名称而已
底层原理是用了 __getattr__
Response类(响应)
from rest_framework.response import Response
在Response类的源码中有这么鸡哥参数
data=None | 为响应准备的序列化处理后的数据 |
status=None | content_type=None |
headers=None |
用于存放响应头信息的字典 |
template_name=None | 模板名称,如果使用HTMLRenderer 时需指明 |
content_type=None | 响应数据的Content-Type,通常此参数无需传递,REST framework会根据前端所需类型数据来设置该参数。 |
1. data
字典,列表---》序列化成json格式字符串,返回给前端(放在http响应的body中了)
2. status
http 响应的状态码,默认是200,201
drf帮咱们把所有的http响应状态码都做成了常量,可以直接导进来用
from rest_framework.status import HTTP_200_OK
1xx 信息告知
2xx 成功
3xx 重定向
4xx 客户端错误
5xx 服务器错误
3. headers
http的响应头,字典 {name:lqz}
如果是原生django在响应头中加数据
res=JsonResponse(d)
res['rrr'] = 'yyyy'
return res
4. template_name
了解:在浏览器中看到好看的页面,指定的模板
5. content_type
响应的编码格式(json)
drf 能够解析的请求编码,响应编码
我们在使用postman去访问的时候Content_Type的格式是application/json
再用浏览器访问的时候Content_Type的格式是text/html; charset=utf-8
我们也可以通过drf的DEFAULT_PARSER_CLASSES 去要求请求编码格式
能够解析的请求编码
在drf中默认能够解析三种
-urlencoded
-form-data
-json
'rest_framework.parsers.JSONParser', 可以解析json格式
'rest_framework.parsers.FormParser', 可以解析urlencoded格式
'rest_framework.parsers.MultiPartParser' 可以解析form-data格式
在drf中这些都是通过drf内部配置好了的
在drf中有两套
一套是默认的配置
drf的配置文件settings.py中有 DEFAULT_PARSER_CLASSES(默认的解析类)
一套是项目中的配置(settings.py)
实现接口只能接受json格式
方式一:全局配置
在项目的配置文件settings.py中配置,以后的所有接口都遵循这个配置(太死板)
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
# 'rest_framework.parsers.FormParser',
# 'rest_framework.parsers.MultiPartParser',
],
}
方式二:局部配置
在我们的视图类中配置,想用哪个就把那个导进来
class TestView(APIView):
parser_classes = [JSONParser,FormParser,MultiPartParser]
总结:
解析类的使用顺序:优先用视图类自己的,然后用项目配置文件,最后用内置的
实际项目如何配置?
基本上都运行JSONParser,FormParser
如果上传文件只允许MultiPartParser
响应编码
如果用浏览器,好看的样子,如果用postman看到json格式
全局配置
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
# 'rest_framework.renderers.JSONRenderer', # json格式
'rest_framework.renderers.BrowsableAPIRenderer', #浏览器的格式
如果将浏览器的格式注释掉,浏览器就不会有好看的页面
]
}
局部配置
class TestView(APIView):
renderer_classes = [JSONRenderer,]
GenericAPIView和APIView(2个视图基类)
GenericAPIView
GenericAPIView-->继承了APIView
类属性
queryset = User.objects.all()
serializer_class = UserSerializer 继承的
方法
1. self.get_object() # 根据pk获取单个数据
2. self.get_serializer # 获取要使用的序列化类
3. self.get_queryset() # 获取所有要序列化数据
作业一:
from rest_framework.generics import GenericAPIView
class BookView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
# 拿到所有图书
def get(self,request):
book_list = self.get_queryset()
ser = self.get_serializer(instance=book_list,many=True)
return Response(ser.data,headers={'name':'lqz'})
# 新增图书
def post(self,request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code':100,'msg':'新增成功'})
else:
return Response({'code': 101, 'msg': '新增失败'})
class BookDetailView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
# 拿到一条图书
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':'修改成功'})
else:
return Response({'code':101,'msg':'修改失败'})
# 删除图书
def delete(self,request,pk):
self.get_object().delete()
return Response('')
作业二:
from rest_framework.generics import GenericAPIView
# 获取所有图书
class GetBookView(GenericAPIView):
def get(self, request):
book_list = self.get_queryset()
ser = self.get_serializer(instance=book_list, many=True)
return Response(ser.data)
# 新增图书
class NewBookView(GenericAPIView):
def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "新增成功"})
else:
return Response({'code': 101, 'msg': '新增失败'})
# 拿到一本图书
class GetOneBookView(GenericAPIView):
def get(self, request, pk):
book = self.get_object()
ser = self.get_serializer(instance=book)
return Response(ser.data)
# 修改图书信息
class PutBookView(GenericAPIView):
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': "修改成功"})
else:
return Response({'code': 101, 'msg': '修改失败'})
# 删除一本图书
class DeleteBookView(GenericAPIView):
def delete(self, request, pk):
self.get_queryset().filter(pk=pk).delete()
return Response('')
class BookView(GetBookView, NewBookView):
queryset = Book.objects.all()
serializer_class = BookSerializer
class BookDetailView(GetOneBookView, PutBookView, DeleteBookView):
queryset = Book.objects.all()
serializer_class = BookSerializer
作业三:
from rest_framework.generics import GenericAPIView
# 获取所有图书
class GetBookView(GenericAPIView):
def get(self, request):
book_list = self.get_queryset()
ser = self.get_serializer(instance=book_list, many=True)
return Response(ser.data)
# 新增图书
class NewBookView(GenericAPIView):
def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "新增成功"})
else:
return Response({'code': 101, 'msg': '新增失败'})
# 拿到一本图书
class GetOneBookView(GenericAPIView):
def get(self, request, pk):
book = self.get_object()
ser = self.get_serializer(instance=book)
return Response(ser.data)
# 修改图书信息
class PutBookView(GenericAPIView):
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': "修改成功"})
else:
return Response({'code': 101, 'msg': '修改失败'})
# 删除一本图书
class DeleteBookView(GenericAPIView):
def delete(self, request, pk):
self.get_queryset().filter(pk=pk).delete()
return Response('')
class GetAndNewBookView(GetBookView, NewBookView):
pass
class GetOneAndPutView(GetOneBookView, PutBookView):
pass
class PutAndDeleteView(PutBookView, DeleteBookView):
pass
class GetOneAndPutAndDeleteView(GetOneAndPutView, PutAndDeleteView):
pass
class BookView(GetAndNewBookView):
queryset = Book.objects.all()
serializer_class = BookSerializer
class BookDetailView(GetOneAndPutAndDeleteView):
queryset = Book.objects.all()
serializer_class = BookSerializer
标签:ser,编码,请求,get,self,request,Response,class,drf
From: https://www.cnblogs.com/scx-xiaochun/p/16742376.html