REST framework的 Request 类扩展了Django标准的 HttpRequest ,添加了对REST framework请求解析和身份验证的支持。
源代码片段:
class Request(object):
"""
Wrapper allowing to enhance a standard `HttpRequest` instance.
Kwargs:
- request(HttpRequest). The original request instance.
- parsers_classes(list/tuple). The parsers to use for parsing the request content.
- authentication_classes(list/tuple). The authentications used to
try
authenticating the request's user.
""" def __init__(self, request, parsers=None, authenticators=None,negotiator=None, parser_context=None):
assert isinstance(request, HttpRequest), ('The `request` argument must be an instance of ''`django.http.HttpRequest`, not `{}.{}`.'
.format(request.__class__.__module__,
request.__class__.__name__)
)
self._request = request
self.parsers = parsers or ()
self.authenticators = authenticators or ()
self.negotiator = negotiator or self._default_negotiator()
self.parser_context = parser_context
self._data = Empty
self._files = Empty
self._full_data = Empty
self._content_type = Empty
self._stream = Empty
请求解析相关
REST framework的request请求对象以通常处理表单数据相同的方式使用JSON数据或其他媒体类型处理请求。下面的属性是request中数据主体的部分。
.data
request.data 返回请求正文的解析内容,这与标准的 request.POST 和 request.FILES 属性类似,除了下面的区别:
request.data 包含所有解析的内容, 包括 文件或非文件输入。
request.data 支持除 POST 之外的HTTP方法,这意味着你可以访问 PUT 和 PATCH 请求的内容。
request.data 支持更灵活的请求解析,而不仅仅是表单数据。 例如,你可以与处理表单数据相同的方式处理传入的JSON数据。
@property
def data(self):
if not _hasattr(self, '_full_data'):
self._load_data_and_files()
return self._full_data
query_params
request.query_params 是 request.GET 的一个更准确的同义词,也就是在DRF中的替代品。
为了让你的代码清晰明了, 我们建议使用 request.query_params 而不是Django标准的request.GET 。这样做有助于保持代码库更加正确和明了。通俗地说,就是不要把DRF的属性/方法名和Django原生的属性/方法名混用
def query_params(self):
"""
More semantically correct name for request.GET.
"""
return self._request.GET
.parsers
APIView 类或 @api_view 装饰器将根据view中设置的 parser_classes 值或DEFAULT_PARSER_CLASSES 配置参数进行设置,确保此属性自动设置为 Parser 实例列表,通常并不需要访问这个属性。
 
Note: 如果客户端发送格式错误的内容,则访问 request.data 可能会引发 ParseError 。默认情况下REST framework的 APIView 类或 @api_view 装饰器将捕获误并返回 400 Bad Request 响应。
 
如果客户端发送具有无法解析的内容类型(content-type)的请求,则会引发 UnsupportedMediaType 异常, 默认情况下会捕获该异常并返回 415 Unsupported
Media Type 响应。
 
内容协商相关
 
request请求对象还提供了一些属性允许你确定内容协商阶段的结果。这允许你实现具体的行为,例如为不同的媒体类型选择不同的序列化方案。
 
.accepted_renderer
内容协商阶段选择的renderer实例。
.accepted_media_type
内容协商阶段接受的媒体类型的字符串。
 
认证相关
requset对象提供了灵活的,每次请求都进行验证的认证功能,并支持下面的特性:
对API的不同部分使用不同的身份验证策略。
支持同时使用多种身份验证策略
提供与传入请求相关联的用户和令牌信息
.user
request.user 默认情况下使用的是Django自带的auth框架的用户模型,返回一个 django.contrib.auth.models.User 实例。但该行为取决于你所使用的的认证策略,很显然当你使用第三方认证模块时,就不一样了。如果请求未认证则 request.user 的默认值为 django.contrib.auth.models.AnonymousUser 的一个实例。
.auth
request.auth 返回所有附加的身份验证上下文。 其实际行为取决于所使用的具体认证策略。如果请求未认证或者没有其他上下文,则 request.auth 的默认值为 None 。
 
.authenticators
使用的认证策略。通常并不需要访问此属性。
 
浏览器相关
REST framework 支持一些浏览器增强功能,例如基于浏览器的 PUT , PATCH 和 DELETE 表单功能。
下面是request对象中关于浏览器增强相关的一些属性:
.method
request.method 返回请求的HTTP方法的 大写 字符串表示形式。
隐含支持基于浏览器的 PUT , PATCH 和 DELETE 方法。
 
.content_type
request.content_type 返回HTTP请求正文的媒体类型的字符串对象,如果未提供媒体类型,则返回空字符串。也就是正文的格式。
一般我们不使用这个属性,但如果真要在DRF中访问请求的内容类型,请务必使用 .content_type 属性,而不是使用 request.META.get('HTTP_CONTENT_TYPE') , 因为前者为基于浏览器的非表单内容提供了隐含的支持。
 
.stream
request.stream 返回请求主体内容的流形表示。
我们通常不需要直接访问请求的内容主体,而是依赖REST framework默认的请求解析行为。
request._request
如果你强烈需要使用Django原生的request对象,请这么调用: request._request
由于 REST framework 的 Request 对象扩展了 Django的 HttpRequest 对象, 所以所有Django
原生的标准属性和方法也是可用的。例如 request.META 和 request.session 字典正常可用。
请注意, DRF的 Request 类并不是直接继承Django原生的 HttpRequest 类,而是使用合成扩展出来的。

18.drf request及源码分析的更多相关文章

  1. Python学习---Django的request.post源码分析

    request.post源码分析: 可以看到传递json后会帮我们dumps处理一次最后一字节形式传递过去

  2. Django(48)drf请求模块源码分析

    前言 APIView中的dispatch是整个请求生命过程的核心方法,包含了请求模块,权限验证,异常模块和响应模块,我们先来介绍请求模块 请求模块:request对象 源码入口 APIView类中di ...

  3. Django(49)drf解析模块源码分析

    前言 上一篇分析了请求模块的源码,如下: def initialize_request(self, request, *args, **kwargs): """ Retu ...

  4. Django(50)drf异常模块源码分析

    异常模块源码入口 APIView类中dispatch方法中的:response = self.handle_exception(exc) 源码分析 我们点击handle_exception跳转,查看该 ...

  5. Django(51)drf渲染模块源码分析

    前言 渲染模块的原理和解析模块是一样,drf默认的渲染有2种方式,一种是json格式,另一种是模板方式. 渲染模块源码入口 入口:APIView类中dispatch方法中的:self.response ...

  6. Request类源码分析

    通过APIView进入找到Request的源码 可以看见一堆属性和方法,其中request.data其实是一个方法,被包装成一个属性 继续看__getattr__和query_params方法: 代码 ...

  7. 曹工说Spring Boot源码(18)-- Spring AOP源码分析三部曲,终于快讲完了 (aop:config完整解析【下】)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  8. Djang drf:APIView源码分析

    Django REST framework 简介   在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的.        开发REST AP ...

  9. 19.drf response及源码分析

    源代码位于:response.py   REST framework 提供一个 Response 类来支持 HTTP内容协商,该类允许返回可以呈现为多种类型的内容,具体取决于客户端的请求.   这个 ...

随机推荐

  1. java-servlet-转发AND路径

    转发: a) 什么是转发?一个web组件将未完成的任务交给另一个web组件继续做.通常是一个servlet将数据获取之后转交给jsp进行展现.注:web组件值得是servlet或者jsp b) 如何转 ...

  2. RabbitMQ 入门系列:3、基础含义:持久化、排它性、自动删除、强制性、路由键。

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  3. Spring mvc源码分析系列--前言

    Spring mvc源码分析系列--前言 前言 距离上次写文章已经过去接近两个月了,Spring mvc系列其实一直都想写,但是却不知道如何下笔,原因有如下几点: 现在项目开发前后端分离的趋势不可阻挡 ...

  4. hotspot算法实现 <<深入理解Java虚拟机>>

    1.枚举根节点 解决何时枚举,不需要实时的枚举,oopMap数据结构对象存储枚举信息 对象引用发生变化,需要存储每一条指令到OOPMap吗,,几百M的对象耗时需要很大的内存.GC空间成本 2.安全点: ...

  5. html页面中插入html的标签,JS控制标签属性

    html页面中插入html的标签 方法1: 使用标签: <textara> </textara>标签 方法2: 使用JS: document.getElementById(&q ...

  6. 如何在Apple Silicon Mac上主动安装Rosetta2

    前提是您的电脑搭载了Apple Silicon处理器 command + space(空格),输入"终端",打开. 输入 : softwareupdate --install-ro ...

  7. Spring常用注解(SpirngBoot方面讲的更加详细)

    注解实现自动装配 使用注解须知: 导入约束,context约束 配置注解的支持 <?xml version="1.0" encoding="UTF-8"? ...

  8. KingbaseES R3 集群pcp_attach_node 更新show pool_nodes中节点状态

    系统环境: 操作系统: [kingbase@node2 bin]$ cat /etc/centos-release CentOS Linux release 7.2.1511 (Core) 数据库: ...

  9. React Native入门 Enable live Reload

    在开发项目时,有时一点点小修改就需要重新编译,打包,安装,效率比较低 RN 提供了一种实时重载 (Enable live Reload)的方式,来实现快速的调试开发,修改保存后会立刻载真机或模拟器中显 ...

  10. 一篇文章带你掌握主流数据库框架——MyBatis

    一篇文章带你掌握主流数据库框架--MyBatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射. 在之前的文章中我们学习了MYSQL和JDBC,但是这些东西远远不 ...