首页 > 其他分享 >drf请求与相应(Request,Response),drf能够解析的请求编码,响应编码,GenericAPIView和APIView(2个视图基类)

drf请求与相应(Request,Response),drf能够解析的请求编码,响应编码,GenericAPIView和APIView(2个视图基类)

时间:2022-09-29 20:33:57浏览次数:44  
标签:ser 编码 请求 get self request Response class drf

  • 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

相关文章

  • drf学习笔记
    今日内容概要drf之请求与响应drf之视图组件两个视图基类今日内容详细补充知识反射:通过字符串动态的获取,设置,判断对象中得属性或方法-getattr:res=getattr(se......
  • axios请求配置
    importaxiosfrom'axios'importqsfrom'qs'axios.defaults.headers['Content-Type']='application/x-www-form-urlencoded;charset=UTF-8'//'Content-Type':'a......
  • 编码规范(本文档属于半成品)
     引言1.1  编写目的这是一份旨在增强团队的开发协作,提高代码质量和打造开发基石的编码风格规范。目前其中包含了HTML、JavaScript和css/scss几个部分。 1.2  项目背......
  • jsonp 跨域请求
    背景:JavaScript是一种在Web开发中经常使用的前端动态脚本技术。在JavaScript中,有一个很重要的安全性限制,被称为“Same-OriginPolicy”(同源策略)。这一策略对于JavaScrip......
  • drf之试图基类
    一、请求与响应#现在我们在写视图类的时候都是继承了APIView#而APIView的request都变成了新的request了跟继承了View的request已经不一样了#所以每次请求都是一个......
  • drf之请求与响应,drf之视图组件,2个视图基类
    1.drf之请求与响应在继承drf中的APIView时Request它的请求对象request就不是原来的那个request了(具体去看APIView源码分析),所以没钱请求的request都是一个新的对象,这......
  • CentOS7.6 修改文件编码
    概述程序读取经纬度坐标配置文件,经纬度坐标要求格式为度分秒格式。程序读取到的文件内容写入到另一个文件后,新文件乱码。分析查看文件编码格式:file--mime-fileencodingxx......
  • drf之请求与响应、drf之视图组件、2个视图基类
    drf之请求与响应Request和Response类继承APIView后,请求对象:request,每一次请求都是一个新的requestRequest类:属性或方法data:POST、PUT、PATCH请求方式解析后的数据......
  • controller接受body为 application/x-www-form-urlencoded类型的请求demo
    @RequestMapping(value="/receive",method=RequestMethod.POST,consumes=MediaType.APPLICATION_FORM_URLENCODED_VALUE)publicStringqdjk(@RequestParamMap<S......
  • jQuery的$.getJSON()方法在浏览器上不能请求到本地文件
    前言今天运行很久之前写的一个echarts页面,当时是练习写demo之前写了关于地图动态的一个图表,突然显示不成功,并且报错发现了是jQuery的$.getJSON()这个方法在浏览器上不能......