1: Django-DRF-Requests和Response

Requests--Response

Requests(请求)

如果你正在做基于REST的Web服务...你最好忽略request.POST。— Malcom Tredinnick, Django developers group

REST framework的Request类扩展了标准的HttpRequest,添加对REST framework的灵活请求解析和请求身份验证的支持。

Request parsing(请求解析)

REST framework的请求对象提供灵活的请求解析,允许你以与通常处理表单数据相同的方式使用JSON数据或其他媒体类型处理请求。

.data

request.data 返回请求正文的解析内容。这与标准的 request.POST 和 request.FILES 属性类似,除了下面的:

  • 它包括所有解析的内容, 包括 文件或非文件 输入。

  • 它支持解析除POST之外的HTTP方法的内容,这意味着你可以访问PUT和PATCH请求的内容。

  • 它支持REST framework灵活的请求解析,而不仅仅支持表单数据。 例如,你可以以与处理传入表单数据相同的方式处理传入的JSON数据。

更多详细信息请参阅parsers documentation.

.query_params

request.query_params是request.GET的一个更准确的同义词。

为了让你的代码清晰明了, 我们建议使用 request.query_params 而不是Django标准的request.GET。这样做有助于保持代码库更加正确和明了——任何HTTP方法类型可能包括查询参数,而不仅仅是GET请求。

.parsers

APIView类或@api_view装饰器将根据view中设置的parser_classes集合或基于DEFAULT_PARSER_CLASSES设置,确保此属性自动设置为Parser实例列表。

你通常并不需要访问这个属性。

Note: 如果客户端发送格式错误的内容,则访问request.data可能会引发ParseError。默认情况下REST framework的 APIView类或@api_view装饰器将捕获错误并返回400 Bad Request响应。

如果客户端发送具有无法解析的内容类型的请求,则会引发 UnsupportedMediaType 异常, 默认情况下会捕获该异常并返回 415 Unsupported Media Type 响应。

Content negotiation(内容协商)

请求提供了一些属性允许你确定内容协商阶段的结果。这允许你实现具体的行为,例如为不同的媒体类型选择不用的序列化方案。

.accepted_renderer

由内容协商阶段选择的render实例。

.accepted_media_type

由内容协商阶段接受的媒体类型的字符串。

Authentication(认证)

REST framework 提供了灵活的,每次请求的验证,让你能够: * 对API的不同部分使用不同的身份验证策略。 * 支持使用多个身份验证策略。 * 提供与传入请求相关联的用户和令牌信息。

.user

request.user 通常返回一个 django.contrib.auth.models.User 实例, 尽管该行为取决于所使用的的认证策略。

如果请求未认证则 request.user 的默认值为 django.contrib.auth.models.AnonymousUser的一个实例。

.auth

request.auth 返回任何其他身份验证上下文。 request.auth 的确切行为取决于所使用的的认证策略,但它通常可以是请求被认证的token的实例。

如果请求未认证或者没有其他上下文,则 request.auth 的默认值为 None.

.authenticators

APIView 类或 @api_view 装饰器将根据在view中设置的 authentication_classes 或基于DEFAULT_AUTHENTICATORS 设置,确保此属性自动设置为 Authentication 实例的列表。

你通常并不需要访问此属性。

Browser enhancements(浏览器增强)

REST framework 支持一些浏览器增强功能,例如基于浏览器的 PUT, PATCH 和 DELETE 表单。

.method

request.method 返回请求的HTTP方法的 大写 字符串表示形式。

透明地支持基于浏览器的 PUT, PATCH 和 DELETE 表单。

.content_type

request.content_type 返回表示HTTP请求正文的媒体类型的字符串对象,如果未提供媒体类型,则返回空字符串。

你通常不需要直接访问请求的内容类型,因为你通常将依赖于REST framework的默认请求解析行为。

如果你确实需要访问请求的内容类型,你应该使用 .content_type 属性,而不是使用 request.META.get('HTTP_CONTENT_TYPE'), 因为它为基于浏览器的非表单内容提供了透明的支持。

.stream

request.stream 返回一个表示请求主体内容的流。

你通常不需要直接访问请求的内容类型,因为你通常将依赖于REST framework的默认请求解析行为。

Standard HttpRequest attributes(标准HttpRequest属性)

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

请注意,由于实现原因, Request 类并不会从 HttpRequest 类继承, 而是使用合成扩展类。

Responses

与基本的HttpResponse对象不同, TemplateResponse 对象保留view提供的上下文的详细信息以计算 response. Response的最终输出直到它在稍后的响应过程中被需要才会计算。— Django 文档

REST framework 通过提供一个 Response 类来支持 HTTP content negotiation,该类允许你返回可以呈现为多种内容类型的内容,具体取决于客户端的请求。

Response 类是 Django中 SimpleTemplateResponse 类的一个子类。Response 对象用Python基本数据类型初始化。 然后REST framework 使用标准的HTTP content negotiation 来确定如何呈现最终的响应内容。

你并不需要一定是用 Response 类,你可以从你的视图返回常规的 HttpResponse 或者 StreamingHttpResponse 对象。使用Response类只提供了一个可以呈现多种格式的更好的界面来返回 content-negotiated 的 Web API 响应。

除非由于某种原因你要对 REST framework 做大量的自定义,否则你应该始终对返回对象的views使用 APIView 类或者 @api_view 函数。这样做可以确保视图在返回之前能够执行 content negotiation 并且为响应选择适当的渲染器。

创建 responses

Response()

签名: Response(data, status=None, template_name=None, headers=None, content_type=None)

与常规的 HttpResponse 对象不同,你不能使用渲染内容来实例化一个 Response 对象,而是传递未渲染的数据,包含任何Python基本数据类型。

Response 类使用的渲染器无法自行处理像 Django model 实例这样的复杂数据类型,因此你需要在创建 Response 对象之前将数据序列化为基本数据类型。

你可以使用 REST framework的 Serializer 类来执行此类数据的序列化,或者使用你自定义的来序列化。

参数:

  • data: response的数列化数据.

  • status: response的状态码。默认是200. 另行参阅 status codes.

  • template_name: HTMLRenderer 选择要使用的模板名称。

  • headers: A dictionary of HTTP headers to use in the response.

  • content_type: response的内容类型。通常由渲染器自行设置,由content negotiation确定,但是在某些情况下,你需要明确指定内容类型。

属性

.data

Request 对象的未渲染内容。

.status_code

HTTP 响应的数字状态吗。

.content

response的呈现内容。 .render() 方法必须先调用才能访问 .content 。

.template_name

template_name 只有在使用 HTMLRenderer 或者其他自定义模板作为response的渲染器时才需要提供该属性。

.accepted_renderer

将用于呈现response的render实例。

自动通过 APIView 或者 @api_view 在view返回response之前设置。

.accepted_media_type

由 content negotiation 阶段选择的媒体类型。

自动通过 APIView 或者 @api_view 在view返回response之前设置。

.renderer_context

一个将传递给渲染器的.render()方法的附加上下文信息字典。

自动通过 APIView 或者 @api_view 在view返回response之前设置。

标准的HttpResponse 属性

Response 类扩展了 SimpleTemplateResponse,并且所有常用的属性和方法都是提供的。比如你可以使用标准的方法设置response的header信息:

response = Response()

response['Cache-Control'] = 'no-cache'

.render()

Signature: .render()

和其他的 TemplateResponse 一样,调用该方法将response的序列化数据呈现为最终的response内容。 当 .render() 被调用时, response的内容将被设置成在 accepted_renderer实例上调用 .render(data, accepted_media_type, renderer_context) 方法返回的结果。

你通常并不需要自己调用 .render() ,因为它是由Django的标准响应周期来处理的。

posted @ 2021-06-17 15:11  IT小码农!!!!  阅读(94)  评论(0)    收藏  举报