美文网首页
16、Django_rest framework_视图类/Vie

16、Django_rest framework_视图类/Vie

作者: 猪儿打滚 | 来源:发表于2019-12-09 19:45 被阅读0次

    APIView介绍

    1.继承django的View
    2.APIView和View的不同之处:
    a.传入到view方法中的是Request对象,而不是django的HttpRequest对象
    b.view方法可以返回Response对象,会把响应数据处理为符合前端要求的数据格式
    c.任何APIException异常都会被捕获到,并且处理成合适的响应信息
    d.再进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制
    3.常用的类属性
    a.authentication_classes:身份认证类,列表或元组
    b.permlssoln_classes:权限检查类,列表或元组
    c.throttle_classes:流量控制类,列表或元组

    请求处理的优化(继承APIView,使用它的request

    • 痛点:在之前所写的原始django代码中,只能接收json类型的参数,不能接收比如form表单格式的参数,否则会报错500

    • 解决
      1.导入from rest_framework.views import APIView类,并且视图类继承APIView,并使用APIViewrequest
      2.不管传来的是json,还是form表单,都可以通过request.data来进行获取其中的内容。所以,之前代码中对前端传来的参数的解码等操作,就没必要进行了
      3.只需要在View类继承APIView即可,其它的操作照旧(对json的解码等操作可省略)

    • 继承了APIView对象后的Request
      1.它是对django的HttpRequest对象的拓展,会对请求数据中的请求头中Content-Type的内容进行判断并处理,所以,不管前端发送什么数据类型的数据,都可以用request.data进行获取到
      2.支持Django.request的所有对象和方法

    • request.data
      1.类似django的request.POSTrequest.FILES,可以对post/put/patch的请求数据进行解析,并获取到请求数据的主体内容(dict类型)。并且支持json、form等格式的请求数据
      2.序列化示例:serializer = ProjectSerializer(data=request.data)

    • request.query_params
      类似django的request.GET,可获取get请求的参数

    响应数据的优化(继承APIView,使用它的response

    • 痛点:在之前所写的原始django代码中,只能返回json类型的数据,不能返回比如html、xml等类型

    • 解决
      1.使用APIViewResponse
      2.返回序列化后的数据,示例:return Response(serialize.data)

    • APIViewResponse
      1.对django的HttpResponse进行了拓展,可以返回json、html、xml等格式的数据
      2.根据请求头的Accept,自动转化响应数据为对应的数据格式,并返回响应
      3.如果请求头中没有设置Accept就会采用默认方法对响应数据进行处理,默认是返回json格式(可能有bug?)
      4.如果不想默认,那么可以设置默认的响应渲染格式:
      a.到项目/setting.py中指定默认渲染类

    # 指定默认渲染类
    REST_FRAMEWORK = {    
    "DEFAULT_RENDERER_CLASSES": (        
        # json渲染器为第一优先级
        "rest_framework.renderers.JSONRenderer",        
        # 可浏览的API渲染为第二优先级,可以通过步骤b中的url去查看api文档  
         "rest_framework.renderers.BrowsableAPIRenderer",    )}
    

    b.可浏览的API视图(rest framework自带的):
    urls.py的路由设置中,设置

    path('api/', include('rest framework.url'))
    
    • 详解Response(data, status=None, template_name=None, headers=None,content_type=None )
      1.data:值是序列化处理后的数据,一般是serializer.data(数据类型为python的基础数据类型:字典/嵌套字典/嵌套字典的列表)
      2.status:状态吗,默认200
      3.template_name:想要返回的html模版的名称,使用HTMLRenderer渲染时需要指明
      4.headers:用于存放响应信息头,dict
      5.content_type:响应头的Content-Type,通常此参数无需设置,会自动根据前端所需要类型来设置该参数(比如前端设置Accpet:text/html,那么就会返回html页面给前端)
    • status的常量可以在from rest_framework import status查看

    DRF自带的api浏览页面

    • urls.py中,添加以下path,然后进行访问即可
    path('api/', include('rest_framework.urls'))
    

    相关文章

      网友评论

          本文标题:16、Django_rest framework_视图类/Vie

          本文链接:https://www.haomeiwen.com/subject/vcyugctx.html