t015dbf210b564fb7e2.jpg

请求对象

REST框架引入了一个Request对象,该对象扩展了regular HttpRequest,并提供了更灵活的请求解析。Request对象的核心功能是request.data属性,该属性与相似request.POST,但对于使用Web API更为有用。

  1. request.POST # Only handles form data. Only works for 'POST' method.
  2. request.data # Handles arbitrary data. Works for 'POST', 'PUT' and 'PATCH' methods.

REST框架的Request对象提供灵活的请求解析,使您能够以与通常处理表单数据相同的方式来处理JSON数据或其他媒体类型的请求。

request.data

request.data返回请求正文的解析内容。这类似于标准request.POSTrequest.FILES属性,除了:

  • 它包括所有已解析的内容,包括文件和非文件输入。
  • 它支持解析除以外的HTTP方法的内容POST,这意味着您可以访问PUTPATCH请求的内容。
  • 它支持REST框架的灵活请求解析,而不仅仅是支持表单数据。例如,您可以以处理传入表单数据的相同方式处理传入JSON数据。

有关更多详细信息,请参见解析器文档

request.query_params

request.query_params是的更正确命名的同义词request.GET
为了使代码内部更清晰,我们建议使用request.query_params而不是Django的standard request.GET。这样做将有助于使您的代码库更加正确和明显-任何HTTP方法类型都可以包括查询参数,而不仅仅是GET请求。

request.parsers

APIView类或@api_view装饰将确保这个属性被自动设置为列表Parser实例的基础上,parser_classes对视图设置或基于该DEFAULT_PARSER_CLASSES设置。
您通常不需要访问此属性


注意:如果客户端发送格式错误的内容,则访问request.data可能会引发ParseError。默认情况下,REST框架的APIView类或@api_view装饰器将捕获错误并返回400 Bad Request响应。
如果客户端发送的请求的内容类型无法解析,UnsupportedMediaType则会引发异常,默认情况下将捕获该异常并返回415 Unsupported Media Type响应。


其他内容请差看DjangoRest框架——api指南:请求

响应对象

REST框架还引入了一个Response对象,该对象TemplateResponse采用未呈现的内容并使用内容协商来确定要返回给客户端的正确内容类型。

  1. from rest_framework.response import Response
  2. return Response(data)

REST框架通过提供一个Response类来支持HTTP内容协商,该类允许您根据客户端请求返回可以呈现为多种内容类型的内容。
Response类的子类Django的SimpleTemplateResponseResponse对象用数据初始化,该数据应包含本地Python原语。REST框架然后使用标准的HTTP内容协商来确定应如何呈现最终响应内容。
不需要使用Response该类,也可以根据需要从视图中返回常规HttpResponseStreamingHttpResponse对象。使用Response该类只是为返回内容协商的Web API响应提供了一个更好的接口,该响应可以呈现为多种格式。
除非出于某种原因要大量定制REST框架,否则应始终对返回对象的视图使用APIView类或@api_view函数Response。这样做可以确保在视图返回视图之前,视图可以执行内容协商并为响应选择适当的渲染器。

Response()

签名: Response(data, status=None, template_name=None, headers=None, content_type=None)
与常规HttpResponse对象不同,您不会实例化Response具有渲染内容的对象。相反,您传递未渲染的数据,该数据可能包含任何Python原语。
Response该类使用的渲染器无法本地处理复杂的数据类型,例如Django模型实例,因此您需要在创建Response对象之前将数据序列化为原始数据类型。
您可以使用REST框架的Serializer类来执行此数据序列化,也可以使用自己的自定义序列化。
参数:

  • data:响应的序列化数据。
  • status:HTTP响应的数字状态码,默认值为200。另请参见状态码
  • template_nameHTMLRenderer选择了要使用的模板名称。
  • headers:在响应中使用的HTTP标头字典。
  • content_type:响应的内容类型。通常,这将由呈现器根据内容协商确定自动设置,但是在某些情况下,您需要显式指定内容

    属性

    .data

    响应的未呈现的序列化数据。

    .status_code

    HTTP响应的数字状态码。

    .content

    响应的呈现内容。.render()必须先调用该方法,然后.content才能访问该方法。

    .template_name

    template_name,如果提供。仅当HTMLRenderer或其他自定义模板渲染器是响应的可接受渲染器时才需要。

    .accepted_renderer

    将用于呈现响应的呈现器实例。
    APIView@api_view在视图返回响应之前自动设置。

    .accepted_media_type

    内容协商阶段选择的媒体类型。
    APIView@api_view在视图返回响应之前自动设置。

    .renderer_context

    附加上下文信息的词典,该词典将传递给渲染器的.render()方法。
    APIView@api_view在视图返回响应之前自动设置。

    标准HttpResponse属性

    Response类扩展SimpleTemplateResponse,和所有常见的属性和方法也可在回应。例如,您可以以标准方式在响应上设置标头:
    1. response = Response()
    2. response['Cache-Control'] = 'no-cache'

    .render()

    签名: .render()
    与任何其他TemplateResponse方法一样,调用此方法可将响应的序列化数据呈现为最终响应内容。当.render()被调用时,响应内容将被设置为调用的结果.render(data, accepted_media_type, renderer_context)对方法accepted_renderer实例。
    通常,您不需要自称.render(),因为它是Django的标准响应周期所处理的。

    Django快捷函数-render()

    renderrequesttemplate_namecontext = Nonecontent_type = Nonestatus = Noneusing = None
    将给定的模板与给定的某些字典组合在一起,并以渲染的文本返回一个HttpResponse对象。
    Django没有提供返回:class:〜django.template.response.TemplateResponse的快捷函数,因为:class:〜django.template.response.TemplateResponse的构造函数提供了与:func:` render()`同样的方便程度。

    必选参数

    request用于生成此响应的请求对象。template_name要使用的模板的全名或模板名称的序列。如果给定一个序列,则将使用存在的第一个模板。有关如何查找模板的更多信息,请参见模板加载文档

    可选参数

    context默认情况下,这是一个空的字典。如果字典中的值是可调用的,则视图将在渲染模板之前调用它。content_type用于结果文档的MIME类型'text/html'status响应的状态代码默认为“ 200”。using用于加载模板的模板引擎的:setting:` NAME`。

    例如

    下面的示例使用MIME类型呈现模板” myapp / index.html“ application / xhtml + xml
    1. from django.shortcuts import render
    2. def my_view(request):
    3. # View code here...
    4. return render(request, 'myapp/index.html', {
    5. 'foo': 'bar',
    6. }, content_type='application/xhtml+xml')
    此示例相当于:
    1. from django.http import HttpResponse
    2. from django.template import loader
    3. def my_view(request):
    4. # View code here...
    5. t = loader.get_template('myapp/index.html')
    6. c = {'foo': 'bar'}
    7. return HttpResponse(t.render(c, request), content_type='application/xhtml+xml')