Django REST framework学习笔记(3)-请求和响应

Django REST framework在Django原有的基础上,新增了一个request对象继承了APIView视图类,并在原有的HttpResponse响应类的基础上实现了一个子类Response响应类,这2个类,都是基于内容协商来完成数据的格式转换的。

REST framework传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。

REST framework提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典[QueryDict]对象保存到Request对象中。

request -> parser ->识别客户端请求头中的Content-Type来完成数据转换成->类字典(QueryDict,字典的子类)

Response -> renderer ->识别客户端请求头的Accept来提取客户期望的返回数据格式,转换成客户端的期望格式数据

Request

REST framework引入了一个扩展常规HttpRequest的Request对象,并提供了更灵活的请求解析。允许你使用JSON data或 其他media types像通常处理表单数据一样处理请求。

常用属性

1 request.data返回请求主题的解析内容。这跟标准的request.POST和request.FILES类似,并且还具有以下特点:

  • 包括所有解析的内容,文件(file) 和 非文件(non-file inputs)。
  • 支持解析POST以外的HTTP method , 比如 PUT, PATCH。
  • 更加灵活,不仅仅支持表单数据,传入同样的JSON数据一样可以正确解析,并且不用做额外的处理(意思是前端不管提交的是表单数据,还是JSON数据,.data都能够正确解析)。

request.POST # 只处理表单数据 只适用于’POST’方法 request.data # 处理任意数据 适用于’POST’,’PUT’和’PATCH’方法

2 request.query_params等同于request.GET,不过其名字更加容易理解。为了代码更加清晰可读,推荐使用request.query_params ,而不是Django中的request.GET,这样能够让你的代码更加明显的体现出任何HTTP method类型都可能包含查询参数(query parameters),而不仅仅只是GET请求。

3 request._request获取django封装的Request对象

由于REST framework的Request扩展于Django的HttpRequest,所有其他标准属性和方法也可用。例如request.META和 request.session字典都可以正常使用。

#基本使用 from rest_framework.views import APIView #from rest_framework.request import Request from rest_framework.response import Response class StuAPIView(APIView): def post(self, request): “””获取请求体数据””” print(f”drf.request.data={request.data}”) # 接受的数据会解析成字典 # json: drf.request.data={‘name’: ‘you1’, ‘desc’: ‘hello world’} # form表单: drf.request.data= “””获取查询参数””” print(f”drf.request.query_params={request.query_params}”) # return Response({“msg”: “ok”})

Response

REST框架还引入了一个Response对象,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。

REST framework提供了renderer渲染器,用来根据请求头中的Accept(接收数据类型声明)来自动转换响应数据到对应格式,如果前端请求中未声明Accept,则采用Content-Type方式处理响应数据。

# 由于是默认的配置,所以settings配置文件中可以不配置以下选项 REST_FRAMEWORK = { ‘DEFAULT_RENDERER_CLASSES’: [ #默认响应渲染类 ‘rest_framework.renderers.JSONRenderer’, #json渲染器 ‘rest_framework.renderers.BrowsableAPIRenderer’, #浏览器渲染器,有调试界面 ] } #构造方法 Response(data, status=None, template_name=None, headers=None, content_type=None) #参数: data: 响应的序列化数据。 status: 响应的状态代码。默认为200。 template_name: 选择 HTMLRenderer 时使用的模板名称。 headers: 设置 HTTP header,字典类型。 content_type: 响应的内容类型,通常渲染器会根据内容协商的结果自动设置,但有些时候需要手动指定。 #比较完整的使用 response={‘code’:100,’msg’:’查询成功’,’result’:ser.data} return Response(response,status=status.HTTP_201_CREATED,headers={‘xxx’:”xxx”})

常用属性

  • .data:还没有渲染,但已经序列化的响应数据。
  • .status_code:状态码
  • .content:将会返回的响应内容,必须先调用 .render() 方法,才能访问 .content
  • .template_name:只有在 response 的渲染器是 HTMLRenderer 或其他自定义模板渲染器时才需要提供
  • .accepted_renderer:用于将会返回的响应内容的渲染器实例从视图返回响应之前由 APIView 或 @api_view 自动设置。
  • .accepted_media_type:内容协商阶段选择的媒体类型从视图返回响应之前由 APIView 或 @api_view 自动设置。
  • .renderer_context:将传递给渲染器的 .render() 方法的附加的上下文信息字典从视图返回响应之前由 APIView 或 @api_view 自动设置。
  • 状态码

    为了方便设置状态码,REST framewrok在rest_framework.status模块中提供了常用状态码常量。

    from rest_framework import status #1.信息告知 – 1xx HTTP_100_CONTINUE HTTP_101_SWITCHING_PROTOCOLS #2.成功 – 2xx HTTP_200_OK HTTP_201_CREATED HTTP_202_ACCEPTED HTTP_203_NON_AUTHORITATIVE_INFORMATION HTTP_204_NO_CONTENT HTTP_205_RESET_CONTENT HTTP_206_PARTIAL_CONTENT HTTP_207_MULTI_STATUS #3.重定向 – 3xx HTTP_300_MULTIPLE_CHOICES HTTP_301_MOVED_PERMANENTLY HTTP_302_FOUND HTTP_303_SEE_OTHER HTTP_304_NOT_MODIFIED HTTP_305_USE_PROXY HTTP_306_RESERVED HTTP_307_TEMPORARY_REDIRECT #4.客户端错误 – 4xx HTTP_400_BAD_REQUEST HTTP_401_UNAUTHORIZED HTTP_402_PAYMENT_REQUIRED HTTP_403_FORBIDDEN HTTP_404_NOT_FOUND HTTP_405_METHOD_NOT_ALLOWED HTTP_406_NOT_ACCEPTABLE HTTP_407_PROXY_AUTHENTICATION_REQUIRED HTTP_408_REQUEST_TIMEOUT HTTP_409_CONFLICT HTTP_410_GONE HTTP_411_LENGTH_REQUIRED HTTP_412_PRECONDITION_FAILED HTTP_413_REQUEST_ENTITY_TOO_LARGE HTTP_414_REQUEST_URI_TOO_LONG HTTP_415_UNSUPPORTED_MEDIA_TYPE HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE HTTP_417_EXPECTATION_FAILED HTTP_422_UNPROCESSABLE_ENTITY HTTP_423_LOCKED HTTP_424_FAILED_DEPENDENCY HTTP_428_PRECONDITION_REQUIRED HTTP_429_TOO_MANY_REQUESTS HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS #5.服务器错误 – 5xx HTTP_500_INTERNAL_SERVER_ERROR HTTP_501_NOT_IMPLEMENTED HTTP_502_BAD_GATEWAY HTTP_503_SERVICE_UNAVAILABLE HTTP_504_GATEWAY_TIMEOUT HTTP_505_HTTP_VERSION_NOT_SUPPORTED HTTP_507_INSUFFICIENT_STORAGE HTTP_511_NETWORK_AUTHENTICATION_REQUIRED

    封装Response

    参考链接:https://www.jianshu.com/p/c0be24752584

    #1.response.py from rest_framework.response import Response class APIResponse(Response): def __init__(self, code=100, msg=’成功’, data=None, status=None, headers=None, exception=False, content_type=None, **kwargs): dic = {‘code’: code, ‘msg’: msg} if data: #如果data有值,说明要往里面放东西 dic[‘data’] = data if kwargs: #自定义传的参数会添加到字典里 dic.update(kwargs) super().__init__(data=dic, status=status, headers=headers, exception=exception, content_type=content_type) #2.在视图中使用 from .response import APIResponse return APIResponse(data={‘name’: ‘fana’, ‘age’: 19})

    解析器

    REST framework 包含许多内置的解析器类,允许接受各种媒体类型(media types)的请求。还支持自定义解析器,这使你可以灵活地设计 API 接受的媒体类型。

    #1.settings.py #查看默认解析器 from rest_framework import settings REST_FRAMEWORK = { ‘DEFAULT_RENDERER_CLASSES’: [ #渲染器 ‘rest_framework.renderers.JSONRenderer’, ‘rest_framework.renderers.TemplateHTMLRenderer’, ], ‘DEFAULT_PARSER_CLASSES’: [ #解析器 ‘rest_framework.parsers.JSONParser’, ‘rest_framework.parsers.FormParser’, ‘rest_framework.parsers.MultiPartParser’, ], }

    YAML

    GitHub:https://jpadilla.github.io/django-rest-framework-yaml

    REST framework YAML提供YAML解析和渲染支持。它以前直接包含在REST framework包中,现在作为第三方包

    #1.安装模块 pip install djangorestframework-yaml #2.settings.py REST_FRAMEWORK = { ‘DEFAULT_PARSER_CLASSES’: ( ‘rest_framework_yaml.parsers.YAMLParser’, ), ‘DEFAULT_RENDERER_CLASSES’: ( ‘rest_framework_yaml.renderers.YAMLRenderer’, ), }

    XML

    GitHub:https://jpadilla.github.io/django-rest-framework-xml/

    REST Framework XML提供了一种简单的非正式XML格式。它以前直接包含在REST framework包中,现在作为第三方包。

    #1.安装模块 pip install djangorestframework-xml #2.settings.py REST_FRAMEWORK = { ‘DEFAULT_PARSER_CLASSES’: ( ‘rest_framework_xml.parsers.XMLParser’, ), ‘DEFAULT_RENDERER_CLASSES’: ( ‘rest_framework_xml.renderers.XMLRenderer’, ), }

    郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
    (0)
    用户投稿
    上一篇 2022年7月4日
    下一篇 2022年7月4日

    相关推荐

    联系我们

    联系邮箱:admin#wlmqw.com
    工作时间:周一至周五,10:30-18:30,节假日休息