Flask restful实现(二)

Flask resetful 配置

当Falsk遇到异常的时候,会抛出 HttpException 默认的异常的信息,根据resetful规则,我们需要根据自己的业务状态,定制自己的异常信息返回,在遇到具体的业务逻辑,抛出相应的异常,返回自己的业务信息。

遇到异常的时候返回的是html提示信息




    ZeroDivisionError: division by zero // Werkzeug Debugger
.....

继承扩展 HttpException:这个页面可以定制自己返回格式

from flask import request, json
from werkzeug.exceptions import HTTPException


class APIException(HTTPException):
    code = 500
    msg = 'sorry,we make a mistake(*-_-*)!'
    error_code = 900

    def __init__(self, msg=None, code=None, error_code=None,
                 headers=None):
        if code:
            self.code = code
        if error_code:
            self.error_code = error_code
        if msg:
            self.msg = msg
        super(APIException, self).__init__(msg, None)

    @staticmethod
    def get_url_no_param():
        """
        获取接口路径
        :return:
        """
        full_path = str(request.full_path)
        main_path = full_path.split('?')
        return main_path[0]

    def get_body(self, environ=None):
        body = dict(
            msg=self.msg,
            error_code=self.error_code,
            request=request.method + ' ' + self.get_url_no_param()
        )

        text = json.dumps(body)
        return text

    def get_headers(self, environ=None):
        """Get a list of headers."""
        return [('Content-Type', 'json/application')]

    #返回的json数据格式 示例
    {
        "code":100,
        "msg":"success",
        "error_code":1001
    }

在具体的业务逻辑返回相应的状态即可(相当于直接抛出一个异常信息,显示自定义内容) 示例

@api.route('/register', methods=['POST'])
def create_client():
    form = ClientForm().validate_for_api()
    promise = {
        ClientTypeEnum.USER_EMAIL: __register_user_by_email
    }
    promise[form.type.data]()
    # 可以预知的异常
    return Success()

class Success(APIException):
    code = 201
    msg = 'ok'
    error_code = 1

优化:继承HttpException 只能捕获 http异常的信息,其它非预知的异常信息需要,进行全局的异常捕获 在app入口出配置

@app.errorhandler(Exception)
def framework_error(e):
    """
    全局捕获的异常,在flask1.0才有
    :param e:
    :return:
    """
    if isinstance(e, APIException):
        return e
    if isinstance(e, HTTPException):
        code = e.code
        msg = e.description
        error_code = 1007
        return APIException(msg, code, error_code)
    else:
        # 调试模式
        if not app.config['DEBUG']:
            return ServerError(msg=e.description)
        else:
            raise e
# 一些程序非预知的异常信息,将统一抛出 ServerError信息,设置了一个开关,在debug模式返回默认的信息便于查看。

class ServerError(APIException):
    code = 500
    msg = 'sorry ,there is make a mistake(-_-)'
    error_code = 999

你可能感兴趣的:(Flask restful实现(二))