请求和响应

Request

如果你正在做基于REST的Web服务,你最好忽略request.POST和request.GET

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

请求解析

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

request.data

request.data 返回请求正文的解析内容。这与标准的 request.POST 和 request.FILES 属性类似,但是他将所有的数据包裹在了一起通过.data进行返回。

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

request.query_params

request.query_params是request.GET的一个更准确的同义词。包含了所有用过get方式请求的参数

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

request.parsers

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

这个属性用于标识此接口所使用的parser解析器, 默认情况下使用DEFAULT_PARSER_CLASSES的设置,如果要用自己的,需要进行相关的重写。

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

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

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

Authentication(认证)

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

.user

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

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

.auth

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

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

.authehticators

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

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

浏览器相关

.method

request.method 返回请求的HTTP方法的 大写 字符串表示形式。
透明地支持基于浏览器的 PUT, PATCH 和 DELETE 表单。

content_type

用于标识传输数据的格式类型。 返回表示HTTP请求正文的媒体类型的字符串对象,如果未提供媒体类型,则返回空字符串。

一般不需要知道这个属性, 而是直接由rest_framework提供的默认解析行为来提供。

如果确实需要知道这个属性,就使用.content_type而不是request.META.get(‘HTTP_CONTENT_TYPE’)

.stream

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

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

HttpRequest中的原有字段

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

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

Response

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 并且为响应选择适当的渲染器。

创建Response对象

resp = 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: 一个包含了Http响应头的字典
  • 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,并且所有常用的属性和方法都是提供的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值