Skip to content

Instantly share code, notes, and snippets.

@staugur
Last active September 24, 2019 07:18
Show Gist options
  • Save staugur/19516d311f1ddd19a658412bcccc37bc to your computer and use it in GitHub Desktop.
Save staugur/19516d311f1ddd19a658412bcccc37bc to your computer and use it in GitHub Desktop.
统一返回json数据,允许主动触发异常,拦截所有http异常转为json
# coding:utf8
from flask import Flask, Response, jsonify
from werkzeug.exceptions import HTTPException
class JsonResponse(Response):
@classmethod
def force_type(cls, rv, environ=None):
if isinstance(rv, dict):
rv = jsonify(rv)
return super(JsonResponse, cls).force_type(rv, environ)
class ApiError(Exception):
def __init__(self, code, message, status_code=200):
super(ApiError, self).__init__()
self.code = code
self.message = message
self.status_code = status_code
def to_dict(self):
rv = dict(code=self.code, msg=self.message)
return rv
app = Flask(__name__)
app.response_class = JsonResponse
@app.errorhandler(ApiError)
def handle_api_error(e):
response = jsonify(e.to_dict())
response.status_code = e.status_code
return response
@app.errorhandler(HTTPException)
def handle_exception(e):
response = jsonify({
"code": e.code,
"msg": e.name,
})
response.status_code = e.code
return response
@app.route('/')
def index():
return {
'code': 0,
'msg': None,
}
@app.route('/err')
def err():
raise ApiError(1000, "test error")
if __name__ == '__main__':
app.run(debug=True)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment