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


请求解析

REST framework的Request对象提供了灵活的请求解析,让你可以像一般处理普通form数据一样处理带JSON数据或者媒体类型的request。

.data

request.data返回request body解析后的内容。这类似于标准的request.POSTrequest.FILES属性除了下面几个区别:

  • 它包含了所有解析后的内容,包括文件类型和非文件类型的输入
  • 它支持除了POST类型以外的其他HTTP方法的内容解析,意味着你可以访问PUTPATCH类型reqeust的内容。
  • 它提供REST framework灵活的请求解析,而不单单支持from数据。举例说你可以像处理form数据一样处理JSON数据。
    详细信息,参考parsers documentation

.query_params

request.query_params 是比request.GET更贴切的一个同义词
为了清楚起见,在你的代码里,我们推荐你使用request.query_params来代替Django's标准request.GET。这样做可以让你的代码更准确和明了-任何HTTP方法类型都可能包含查询信息,不紧紧是GET请求。

.parsers

APIView类或者@api_view 装饰器将保证这个属性会被自动赋予一系列的Parser实例,基于这个view的parser_class集合或者基于DEFAULT_PARSER_CLASSES设置
你一般不会访问这个属性


如果一个客户端发送了有缺陷的内容,那么访问request.data也许会引起ParseError。默认情况下REST framework的APIView类或者@api_view装饰器将会捕获这个错误然后返回400 Bad Request的response

如果一个客户端发送了一个包含有不能解析的content-type那么将会引起一个UnsupportedMediaType异常,这个异常将会被捕获并且返回一个415 Unsupported Media Type response


内容协商

request暴漏了一些属性是允许你去判断内容协商阶段的结果。这将允许你去实现一些行为比如给不同的媒体类型选择一个不同的序列化方案

.accepted_renderer

内容协商阶段选出来的渲染器实例

.accepted_media_type

是一个字符串用来表明内容协商阶段接受的媒体类型


验证

REST framework提供了灵活的,针对每一个请求的验证,可以给你的这样的能力:

  • 不同部分的API使用不同的验证策略
  • 支持使用多个验证策略
  • 同时提供即将到来的request相关的user和token信息

.user

request.user一般返回django.contrib.auth.models.User的一个实例,尽管它的行为取决于你使用的验证策略。
如果request没有验证,那么request.user的默认值的django.contrib.auth.models.AnonymousUser
更多信息,查看authentication documentation

.auth

request.auth返回任何额外的授权上下文。reqeust.auth的具体行为取决于使用的认证策略,但一般来说它会是reqeuset请求授权得到token的实例。
更多详细信息请看 authentication documentation

.authenticators

APIView类或者@api_view装饰器将会保证这个属性被自动设置为一列Authentication的实例,基于authentication_classes集合或者基于DEFAULT_AUTHENTICATORS设置。
你一般不需要访问这个属性


浏览器增强

REST framework支持一些浏览器增强比如说是基于浏览器的PUT,PATCH和DELETE表单

.method

request.method返回请求的HTTP方法大写的字符串表达。
基于浏览器PUT,PATCH,DELETE表单被支持

.content_type

request.content_type,返回一个代表HTTP请求body媒体类型的字符串对象,或者一个空串如果没有媒体类型提供的话。你一般不需要直接访问请求的内容类型,因为一般来说你会基于REST框架的默认解析行为
如果你确实需要访问request的媒体类型,你应该使用.content_type属性优先于使用request.META.get('HTTP_CONTENT_TYPE'),因为它提供基于浏览器的非form内容。
.stream
request.stream返回request body的流的展现方式
你一般不会直接访问request的内容,因为你一般会基于REST 框架的默认请求解析实现


标准HttpRequest属性

因为REST framework的Request类扩展自Django's的HttpRequest,所有其他的标准的属性和方法都是可用的。举例来说request.METArequest.session字典都和之前一样
注意因为实现的原因,Request类不是直接继承子HttpRequest类,而是使用组合扩展了它

Django-Rest framework中文翻译-Request的更多相关文章

  1. Django REST FrameWork中文教程2:请求和响应

    从这一点开始,我们将真正开始覆盖REST框架的核心.我们来介绍几个基本的构建块. 请求对象REST框架引入了Request扩展常规的对象HttpRequest,并提供更灵活的请求解析.Request对 ...

  2. Django REST framework 中文教程1:序列化

    建立环境 在我们做任何事情之前,我们将使用virtualenv创建一个新的虚拟环境.这将确保我们的包配置与我们正在开展的任何其他项目保持良好的隔离. virtualenv envsource env/ ...

  3. Django REST framework 第二章 Request and Response

    此章节开始真正的撰写REST framework的核心代码,介绍一系列必要的建立设计 Request Objects REST framework介绍了一个Request对象用来扩展常规的HttpRe ...

  4. DRF (Django REST framework) 中的Request 与 Response

    DRF中的Request 与 Response 1. Request - REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST f ...

  5. Django REST FrameWork中文教程3:基于类的视图

    我们也可以使用基于类的视图编写我们的API视图,而不是基于函数的视图.我们将看到这是一个强大的模式,允许我们重用常用功能,并帮助我们保持代码DRY. 使用基于类的视图重写我们的API 我们将首先将根视 ...

  6. Django-Rest framework中文翻译-generic-views

    通用视图 Django的通用视图......被开发为常见用法模式的快捷方式......它们采用视图开发中的某些常见习语和模式并对其进行抽象,以便您可以快速编写数据的常用视图,而无需重复自己. - Dj ...

  7. Django Rest framework 框架之认证使用和源码执行流程

    用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...

  8. 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...

  9. 《Django By Example》第九章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag 注:哈哈哈,第九章终于来啦 ...

随机推荐

  1. Python print 输出不换行,只有空格

    for x in open("/home/soyo/桌面/中期内容/6.txt"): print x, ,,,]: print x, #print 输出没有换行,只有空格 结果: ...

  2. 使用nginx加zuul配置

    配置文件 $ ls -lrt -rw-r--r-- 1 root root 826 May 10 10:56 nginx.conf $ pwd /etc/nginx 增加配置 在http {}里 up ...

  3. linux 定义变量 ,添加变量值

    1.设置值$name=test2. 输出变量的值 echo $echo $name3. 增加变量内容PATH=$PATH:/home/bin/testPATH="$PATH":/h ...

  4. jsonp 监控简陋代码

    url: window.location.href Agent: navigator.userAgent var tkInfo = { VisitUrl: window.location.href, ...

  5. PHP 小tip .(@)符号和 php if 赋值

    tip 1: 下面介绍一下它的用法. 例如: 复制代码代码如下: function db_connect()//连接数据库 { @$db =mysql_connect('localhost','roo ...

  6. VS2013使用单元测试

    一.开发环境 开发工具:VS2013 二.开发流程 1.添加一个控制台项目UnitDemo namespace UnitDemo { public class Program { static voi ...

  7. C语言学习(1)-环境配置

    写在前面的话,该文章是看杨老师的一套视频,所做的一些笔记,边看边写,再此谢谢杨老师. 1.学习C之前需要避免的误区 误区一:C++是C的升级版:C#是C++的升级版 误区二:C/C++就是Visual ...

  8. 解析SQLite中的常见问题与总结详解

    1. 创建数据如果不往数据库里面添加任何的表,这个数据库等于没有建立,不会在硬盘上产生任何文件,如果数据库已经存在,则会打开这个数据库. 2. 如何通过sqlite3.dll与sqlite3.def生 ...

  9. 2559. [NOIP2016]组合数问题

    [题目描述] [输入格式] 从文件中读入数据. 第一行有两个整数t, k,其中t代表该测试点总共有多少组测试数据,k的意义见[问题描述]. 接下来t行每行两个整数n, m,其中n, m的意义见[问题描 ...

  10. 前端JavaScript入门——JavaScript变量和操作元素

    变量JavaScript 是一种弱类型语言,javascript的变量类型由它的值来决定. 定义变量需要用关键字 ‘var’: var a = 123; var b = 'asd'; //同时定义多个 ...