zoukankan      html  css  js  c++  java
  • Python之错误码设计

    在 web 项目中,我们经常使用自定义状态码来告知请求方请求结果以及请求状态;在 Python 中该如何设计自定义的状态码信息呢?

    1)普通类+字典设计状态码

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # @Desc: { 项目响应码模块 }
    
    
    class RETCODE:
        OK                  = "0"
        ERROR               = "-1"
        IMAGECODEERR        = "4001"
        THROTTLINGERR       = "4002"
        NECESSARYPARAMERR   = "4003"
        
    
    err_msg = {
        RETCODE.OK                 : "成功",
        RETCODE.IMAGECODEERR       : "图形验证码错误",
        RETCODE.THROTTLINGERR      : "访问过于频繁",
        RETCODE.NECESSARYPARAMERR  : "缺少必传参数",
    }

    单独利用一个字典进行状态码信息对照,这样设计一旦状态码多了就不好对照,再使用过程中也没那么方便,简单试下组织一个成功的信息

    data = {
        'code': RETCODE.OK,
        'errmsg': err_msg[RETCODE.OK]
    }

    2)巧用枚举类设计状态码信息

    枚举类定义:

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # @Desc: { 项目枚举类模块 }
    
    from enum import Enum
    
    
    class StatusCodeEnum(Enum):
        """状态码枚举类"""
    
        OK = (0, '成功')
        ERROR = (-1, '错误')
        SERVER_ERR = (500, '服务器异常')

    普通的类继承 enum 模块中的 Enum 类就变成了枚举类。

    在ipython中使用:

    In [21]: ok = StatusCodeEnum.OK
    
    In [22]: type(ok)
    Out[22]: <enum 'StatusCodeEnum'>
    
    In [23]: error = StatusCodeEnum.ERROR
    
    In [24]: type(error)
    Out[24]: <enum 'StatusCodeEnum'>
    
    In [26]: ok.name
    Out[26]: 'OK'
    
    In [27]: ok.value
    Out[27]: (0, '成功')
    
    In [28]: error.name
    Out[28]: 'ERROR'
    
    In [29]: error.value
    Out[29]: (-1, '错误')

    枚举类中的每一个属性都返回一个枚举对象,其中枚举对象有两个重要的属性 namevalue

    • name 枚举对象在枚举类中的属性名
    • value 则是枚举对象在枚举类中对应属性名的值

    用枚举类组组织一个成功的响应信息

    code = StatusCodeEnum.OK.value[0]
    errmsg = StatusCodeEnum.OK.value[1]
    data = {
        'code': code,
        'errmsg': errmsg
    }

    封装枚举类:

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # @Desc: { 项目枚举类模块 }
    
    
    from enum import Enum
    
    
    class StatusCodeEnum(Enum):
        """状态码枚举类"""
    
        OK = (0, '成功')
        ERROR = (-1, '错误')
        SERVER_ERR = (500, '服务器异常')
    
        @property
        def code(self):
            """获取状态码"""
            return self.value[0]
    
        @property
        def errmsg(self):
            """获取状态码信息"""
            return self.value[1]

    通过 @property 装饰器把类型的方法当属性使用,由于 枚举类.属性名 对应着不同的枚举对象就很好的把状态码和信息进行了封装。看看外部调用的结果

    响应:

    data = {
        'code': StatusCodeEnum.OK.code,
        'errmsg': StatusCodeEnum.OK.errmsg
    }

    最终demo:

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # @Desc: { 项目枚举类模块 }
    
    from enum import Enum
    
    
    class StatusCodeEnum(Enum):
        """状态码枚举类"""
    
        OK = (0, '成功')
        ERROR = (-1, '错误')
        SERVER_ERR = (500, '服务器异常')
    
        IMAGE_CODE_ERR = (4001, '图形验证码错误')
        THROTTLING_ERR = (4002, '访问过于频繁')
        NECESSARY_PARAM_ERR = (4003, '缺少必传参数')
        USER_ERR = (4004, '用户名错误')
        PWD_ERR = (4005, '密码错误')
        CPWD_ERR = (4006, '密码不一致')
        MOBILE_ERR = (4007, '手机号错误')
        SMS_CODE_ERR = (4008, '短信验证码有误')
        ALLOW_ERR = (4009, '未勾选协议')
        SESSION_ERR = (4010, '用户未登录')
    
        DB_ERR = (5000, '数据错误')
        EMAIL_ERR = (5001, '邮箱错误')
        TEL_ERR = (5002, '固定电话错误')
        NODATA_ERR = (5003, '无数据')
        NEW_PWD_ERR = (5004, '新密码错误')
        OPENID_ERR = (5005, '无效的openid')
        PARAM_ERR = (5006, '参数错误')
        STOCK_ERR = (5007, '库存不足')
    
        @property
        def code(self):
            """获取状态码"""
            return self.value[0]
    
        @property
        def errmsg(self):
            """获取状态码信息"""
            return self.value[1]
  • 相关阅读:
    运行pyzbar时报 Could not find module ‘libzbar-64.dll ‘or one of its dependenci的错误
    [Tips] pandas 如何根据index进行slice
    [Tips] pandas逐行遍历
    [Tips] Docker build
    [Tips] redis的key自动过期策略
    [Tips] No module named ipykernel错误
    [Tips] mac下anconda python环境中site-package的位置
    [Tips] pandas获取每月最后一天
    [Tips] docker的daemon.json设置私有镜像仓库
    [Tips] nginx端口转发
  • 原文地址:https://www.cnblogs.com/xingxia/p/python_http_code.html
Copyright © 2011-2022 走看看