请求对象
REST框架引入了一个Request
对象,该对象扩展了regular HttpRequest
,并提供了更灵活的请求解析。Request
对象的核心功能是request.data
属性,该属性与相似request.POST
,但对于使用Web API更为有用。
request.POST # Only handles form data. Only works for 'POST' method.
request.data # Handles arbitrary data. Works for 'POST', 'PUT' and 'PATCH' methods.
REST框架的Request对象提供灵活的请求解析,使您能够以与通常处理表单数据相同的方式来处理JSON数据或其他媒体类型的请求。
request.data
request.data
返回请求正文的解析内容。这类似于标准request.POST
和request.FILES
属性,除了:
- 它包括所有已解析的内容,包括文件和非文件输入。
- 它支持解析除以外的HTTP方法的内容
POST
,这意味着您可以访问PUT
和PATCH
请求的内容。 - 它支持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
采用未呈现的内容并使用内容协商来确定要返回给客户端的正确内容类型。
from rest_framework.response import Response
return Response(data)
REST框架通过提供一个Response
类来支持HTTP内容协商,该类允许您根据客户端请求返回可以呈现为多种内容类型的内容。
在Response
类的子类Django的SimpleTemplateResponse
。 Response
对象用数据初始化,该数据应包含本地Python原语。REST框架然后使用标准的HTTP内容协商来确定应如何呈现最终响应内容。
不需要使用Response
该类,也可以根据需要从视图中返回常规HttpResponse
或StreamingHttpResponse
对象。使用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_name
:HTMLRenderer
选择了要使用的模板名称。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
,和所有常见的属性和方法也可在回应。例如,您可以以标准方式在响应上设置标头:response = Response()
response['Cache-Control'] = 'no-cache'
.render()
签名:.render()
与任何其他TemplateResponse
方法一样,调用此方法可将响应的序列化数据呈现为最终响应内容。当.render()
被调用时,响应内容将被设置为调用的结果.render(data, accepted_media_type, renderer_context)
对方法accepted_renderer
实例。
通常,您不需要自称.render()
,因为它是Django的标准响应周期所处理的。Django快捷函数-render()
render
(request,template_name,context = None,content_type = None,status = None,using = 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:
此示例相当于:from django.shortcuts import render
def my_view(request):
# View code here...
return render(request, 'myapp/index.html', {
'foo': 'bar',
}, content_type='application/xhtml+xml')
from django.http import HttpResponse
from django.template import loader
def my_view(request):
# View code here...
t = loader.get_template('myapp/index.html')
c = {'foo': 'bar'}
return HttpResponse(t.render(c, request), content_type='application/xhtml+xml')