rest_framework之status HTTP状态码
Django Rest Framework有一个status.py的文件
通常在我们Django视图(views)中,HTTP状态码使用的是纯数字,像400,404,200,304等,并不是那么很好理解这些数字的含义,而且如果错误代码出错,很容易被忽略;但是在rest_framework中,REST框架为status模块中的每个状态码提供了更明晰的标识符。使用它们来代替纯数字的HTTP状态码是一个很不错的选择。
状态码的使用通常与rest_framework中的Response一块,我们先看看Response的语法定义:
class Response(SimpleTemplateResponse):
"""
An HttpResponse that allows its data to be rendered into
arbitrary media types.
"""
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
"""
Alters the init arguments slightly.
For example, drop 'template_name', and instead use 'data'.
Setting 'renderer' and 'media_type' will typically be deferred,
For example being set automatically by the `APIView`.
"""
super(Response, self).__init__(None, status=status)
if isinstance(data, Serializer):
msg = (
'You passed a Serializer instance as data, but '
'probably meant to pass serialized `.data` or '
'`.error`. representation.'
)
raise AssertionError(msg)
self.data = data
self.template_name = template_name
self.exception = exception
self.content_type = content_type
if headers:
for name, value in six.iteritems(headers):
self[name] = value
......
主要使用的参数data,status。其中status对应的就是我们要讲的status.py中定义的那些状态码。
from rest_framework import status
from rest_framework.response import Response
def example_view(self):
content = {'please move along': 'nothing to see here'}
return Response(content, status=status.HTTP_404_NOT_FOUND)
status下面列出了模块中包含的完整HTTP状态代码集。该模块还包括一组辅助函数,用于测试状态代码是否在给定范围内。
from rest_framework import status
from rest_framework.test import APITestCase
class ExampleTestCase(APITestCase):
def test_url_root(self):
url = reverse('index')
response = self.client.get(url)
self.assertTrue(status.is_success(response.status_code))
有关更详细的HTTP状态码信息,还可以参阅RFC 2616 和RFC 6585。
信息-1xx
此类状态代码表示临时响应。默认情况下,REST框架中没有使用1xx状态代码。
def is_informational(code):
return 100 <= code <= 199
HTTP_100_CONTINUE = 100 # 继续
HTTP_101_SWITCHING_PROTOCOLS = 101 # 交换协议
成功-2xx
此类状态代码表示已成功接收,理解和接受客户端的请求。
def is_success(code):
return 200 <= code <= 299
HTTP_200_OK = 200 # 请求成功OK
HTTP_201_CREATED = 201 # 请求已完成,并导致创建新资源
HTTP_202_ACCEPTED = 202 # 请求已被接受处理,但处理尚未完成
HTTP_203_NON_AUTHORITATIVE_INFORMATION = 203 # 非权威信息
HTTP_204_NO_CONTENT = 204 # 无内容
HTTP_205_RESET_CONTENT = 205 # 重置内容
HTTP_206_PARTIAL_CONTENT = 206 # 服务器已完成对资源的部分GET请求。部分内容
HTTP_207_MULTI_STATUS = 207 # 多状态;由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。
重定向-3xx
此类状态代码指示用户代理需要采取进一步操作才能完成请求。
def is_redirect(code):
return 300 <= code <= 399
HTTP_300_MULTIPLE_CHOICES = 300 # 请求的资源具有多种选择
HTTP_301_MOVED_PERMANENTLY = 301 # 已为所请求的资源分配了一个新的永久URI;永久移动
HTTP_302_FOUND = 302 # 请求的网页被转移到一个新的地址,但客户访问仍继续通过原始URL地址,重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。
HTTP_303_SEE_OTHER = 303 # 可以在不同的URI下找到对请求的响应,并且应该使用该资源上的GET方法检索。
HTTP_304_NOT_MODIFIED = 304 # 如果客户端已执行条件GET请求并允许访问,但文档尚未修改,则服务器应该响应此状态代码。
HTTP_305_USE_PROXY = 305 # 使用代理。必须通过Location字段给出的代理访问所请求的资源。
HTTP_306_RESERVED = 306 # 306状态代码在规范的先前版本中使用,不再使用,并且代码被保留。
HTTP_307_TEMPORARY_REDIRECT = 307 # 临时重定向。请求的资源暂时驻留在不同的URI下。
客户端错误-4xx
4xx类状态代码适用于客户端似乎有错误的情况。除了在响应HEAD请求时,服务器应该包括一个实体,其中包含错误情况的解释,以及它是暂时的还是永久的。
def is_client_error(code):
return 400 <= code <= 499
HTTP_400_BAD_REQUEST = 400 # 错误请求。由于语法格式错误,服务器无法理解请求。客户端不应该在没有修改的情况下重复请求。
HTTP_401_UNAUTHORIZED = 401 # 未经授权。该请求需要用户身份验证。
HTTP_402_PAYMENT_REQUIRED = 402 # 此代码保留供将来使用。
HTTP_403_FORBIDDEN = 403 # 服务器理解请求,但拒绝履行请求。
HTTP_404_NOT_FOUND = 404 # 服务器未找到与Request-URI匹配的任何内容。
HTTP_405_METHOD_NOT_ALLOWED = 405 # 客户端请求中的方法被禁止
HTTP_406_NOT_ACCEPTABLE = 406 # 服务器无法根据客户端请求的内容特性完成请求
HTTP_407_PROXY_AUTHENTICATION_REQUIRED = 407 # 此代码类似于401(未授权),但表示客户端必须首先使用代理进行身份验证。
HTTP_408_REQUEST_TIMEOUT = 408 # 请求超时。客户端在服务器准备等待的时间内没有产生请求。
HTTP_409_CONFLICT = 409 # 由于与资源的当前状态冲突,无法完成请求。
HTTP_410_GONE = 410 # 请求的资源在服务器上不再可用,并且不知道转发地址。预计这种情况将被视为永久性的。网站设计人员可通过301代码指定资源的新位置
HTTP_411_LENGTH_REQUIRED = 411 # 服务器无法处理客户端发送的不带Content-Length的请求信息
HTTP_412_PRECONDITION_FAILED = 412 # 在服务器上测试时,一个或多个请求标头字段中给出的前提条件被评估为false。
HTTP_413_REQUEST_ENTITY_TOO_LARGE = 413 # 服务器拒绝处理请求,因为请求实体大于服务器能够处理的请求实体。
HTTP_414_REQUEST_URI_TOO_LONG = 414 # 请求的资源URL长于服务器允许的长度
HTTP_415_UNSUPPORTED_MEDIA_TYPE = 415 # 服务器无法处理请求附带的媒体格式
HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE = 416 # 客户端请求的范围无效
HTTP_417_EXPECTATION_FAILED = 417 # 服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长。
HTTP_422_UNPROCESSABLE_ENTITY = 422 # 不可处理的请求实体。请求格式正确,但是由于含有语义错误,无法响应。
HTTP_423_LOCKED = 423 # 锁定;当前资源被锁定。
HTTP_424_FAILED_DEPENDENCY = 424 # 错误接洽关系。由于之前的某个请求发生的错误,导致当前请求失败,例如 PROPPATCH。
HTTP_428_PRECONDITION_REQUIRED = 428 # 要求先决条件;先决条件是客户端发送 HTTP 请求时,如果想要请求能成功必须满足一些预设的条件。
HTTP_429_TOO_MANY_REQUESTS = 429 # 请求过多。
HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE = 431 # 请求头字段太大
HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS = 451 # 因法律原因而被官方审查。
服务器错误-5xx
以数字“5”开头的响应状态代码表示服务器知道它已经错误或无法执行请求的情况。除了在响应HEAD请求时,服务器应该包括一个实体,其中包含错误情况的解释,以及它是暂时的还是永久的。
def is_server_error(code):
return 500 <= code <= 599
HTTP_500_INTERNAL_SERVER_ERROR = 500 # 服务器内部错误,无法完成请求
HTTP_501_NOT_IMPLEMENTED = 501 # 服务器不支持请求的功能,无法完成请求
HTTP_502_BAD_GATEWAY = 502 # 服务器在充当网关或代理时,在尝试完成请求时从其访问的上游服务器收到无效响应。
HTTP_503_SERVICE_UNAVAILABLE = 503 # 服务不可用;由于服务器的临时过载或维护,服务器当前无法处理请求。一般为暂时性的。
HTTP_504_GATEWAY_TIMEOUT = 504 # 作为网关或代理服务器,服务器没有收到来自URI指定的上游服务器的及时响应(例如HTTP,FTP,LDAP)或尝试完成时需要访问的其他辅助服务器(例如DNS)请求。
HTTP_505_HTTP_VERSION_NOT_SUPPORTED = 505 # 服务器不支持或拒绝支持请求消息中使用的HTTP协议版本。
HTTP_507_INSUFFICIENT_STORAGE = 507 # 存储空间不足
HTTP_511_NETWORK_AUTHENTICATION_REQUIRED = 511 # 网络认证请求;如果你频繁使用笔记本和智能手机,你可能会注意到大量的公用 WIFI 服务要求你必须接受一些协议或者必须登录后才能使用。
辅助助手
以下辅助函数可用于标识响应代码的类别。
is_informational() # 1xx
is_success() # 2xx
is_redirect() # 3xx
is_client_error() # 4xx
is_server_error() # 5xx
rest_framework之status HTTP状态码的更多相关文章
- Ajax关于readyState(状态值)和status(状态码)的研究
var getXmlHttpRequest = function () { try{ //主流浏览器提供了XMLHttpRequest对象 return new XMLHttpRequest(); } ...
- 探讨Ajax中有关readyState(状态值)和status(状态码)的问题
先看下面一段代码,然后给大家详细介绍,Ajax中有关readyState(状态值)和status(状态码)的问题,具体内容如下所示: var getXmlHttpRequest = function ...
- 500 status http status code 状态码
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status Server error responses 500 Internal Server ...
- status http status code 状态码
RFC 6585 - Additional HTTP Status Codes https://tools.ietf.org/html/rfc6585 https://developer.mozill ...
- Status Code状态码详解对照表
状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必须在 ...
- HTTP Status Codes 状态码
Network Connect Timeout Error
- Spring boot 项目中put提交Date数据时出现type=Bad Request, status=400状态码
1.问题原因 经过测试发现,当客户端页面提交日期为空时会出现以下异常,如果提交日期不为空则不会出现上述问题.出现这种错误的原因是没有对代码中的Date型参数进行格式化,接收为null的日期类型参数时, ...
- http状态码status
status——http状态码 1xx 消息 2xx 成功 3xx 重定向 ▪ 301 Moved Permanently 永久重定向——下回不会再找他了 ▪ 302 Move temporarily ...
- HTTP的报文与状态码
本文是<HTTP权威指南>的读书笔记 HTTP报文是简单的格式化数据块.每条报文都包含一条来自客户端的请求或一条来自服务器的响应.它们由三部分组成: 对报文进行描述的起始行(start l ...
随机推荐
- K-th Number
区间第K大 题目链接 #include <stdio.h> #include <algorithm> #include <vector> #include < ...
- ==和equals方法
Java程序中测试两个变量时否相等有两种方法: == 和 equals. ==判断 当使用==来判断两个变量是否相等时,如果两个变量是基本类型变量,且都是数字类型(不一定要求数据类型严格相同),则只要 ...
- 利用sizeof,得到二维数组的维度
#include <iostream> #include <stdlib.h> using namespace std; int main() { ][]; cout < ...
- docker jetty启动时报错 failed setting default capabilities.
docker 容器中jetty启动fail ,查看/var/log/jetty中的日志发现具体错误信息如下: failed setting default capabilities.set_caps( ...
- mysql in和exists性能比较和使用
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的. 如果查询的两个表大小相当,那么用i ...
- javac 找不到文件 的可能原因
初学Java还不太明白,竟在些简单的事情上栽跟头,分享一下省的麻烦. 当我们配置好JDK和环境变量之后,在命令行下输入javac,说明我们的安装是正确的.
- 利用Jmeter 实现Json格式接口测试
使用Jmeter模拟http请求测试接口,请求类型为json,步骤如下: 1.启动Jmeter:找到Jmeter.bat文件双击启动Jmeter. 2.在测试计划下面添加线程组:测试计划右键--添加 ...
- 树莓派2安装Xware实现迅雷远程下载
首先,远程功能很实用,尤其是基于迅雷的,现在国内的下载基本上迅雷只手遮天,别的工具友好程度不理想,这是对于我这种小白来说. 首先,我的树莓派系统不是原生的,我烧写的是ubuntu16,没有桌面,没有多 ...
- w3c万维网的介绍和html基本构成
怎么与浏览器交互? 1.鼠标 2.键盘输入 w3c标准: 中文名:万维网联盟!外文名:world wide web cansortium万维网联盟创建于1994年,是web技术领域最具权威个影响的国际 ...
- webm视频转换 其他视频格式转换为webm格式
将其他视频格式转换为webm格式 https://files.cnblogs.com/files/bubuchu/html5videoshipingeshizhuanhuanqi.zip