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 2616RFC 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

这样就大大方便了我们对这些状态码的认知,以及出现错误时的判断。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容