我想为Flask-restful API定义自定义的错误处理方法
flask自定义错误(FlaskGenericException)被提出,但没有被restplus错误处理程序处理,它只是抛出一个500内部服务器错误。
不知道为什么在exceptions.py中定义的dict没有作为api响应抛出。
预期结果
{'user': 'Lionel Messi', 'company': 'Soccer Brazil','message': 'A generic error'}
这是我用来测试的文件。
app.py
import json,os
import logging
import sys
import requests
import config
from os import environ
from flask import Flask, request, jsonify, Response
from flask_jwt_extended import (JWTManager, jwt_required)
from flask_restplus import Api, Resource, reqparse, fields, inputs
from cal_Test import calTest
from exceptions import FlaskGenericException
# Setup Flask Server
app = Flask(__name__,root_path=os.path.join(os.getcwd(), './'))
app.config.from_object(config.Config)
api = Api(app=app,
version='0.1',
title="Test Cal API",
doc="/swagger/",
description='TestCal = Cal Test')
ns = api.namespace('/', description='Cal Test Api')
@api.errorhandler(FlaskGenericException)
def handle_error(error):
response = jsonify(error.to_dict())
response.status_code = error.status_code
return response
resource_parser = reqparse.RequestParser()
resource_parser.add_argument('test', type=str, required=True)
resource_flds = api.model('Resource', {
'test': fields.String(required = True),
})
@ns.route('/test', methods=['POST'])
class TestCal(Resource):
# @jwt_required
@ns.doc(body=resource_flds)
@ns.expect(resource_flds, validate=True)
def post(self):
request_data = resource_parser.parse_args()
caltst = calTest()
result = caltst.cal_test(request_data)
response = app.response_class(
response=json.dumps(result),
status=200,
mimetype='application/json'
)
return response
if __name__ == "__main__":
app.run(debug=True)
cal_Test.py
import pandas as pd
import pyodbc
import scipy.stats as st
import numpy as np
import pandas as pd
from scipy.stats import norm
from flask import Flask, request, jsonify
import os
from exceptions import FlaskGenericException
class calTest:
def __init__(self):
self.test_name = 'Hi! I am test'
def cal_test(self,reqdata):
if self.test_name == reqdata['test']:
return "Successfull"
else:
raise FlaskGenericException('A generic error', status_code=404, payload={'user': 'Lionel Messi', 'company': 'Soccer Brazil'})
异常.py,我想为Flask-restful API定义自定义错误处理。
class FlaskGenericException(Exception):
status_code = 500 # default unless overridden
def __init__(self, message, status_code=None, payload=None):
Exception.__init__(self)
self.message = message
if status_code is not None:
self.status_code = status_code
self.payload = payload
def to_dict(self):
rv = dict(self.payload or ())
rv['message'] = self.message
return rv
遇到了同样的问题,我最后使用的是 abort
的方法。我不知道它是否适合你的用例,但可以试试。
from flask import abort
def cal_test(self,reqdata):
if self.test_name == reqdata['test']:
return "Successfull"
else:
abort(404, "A generic error")