【问题标题】:Flask restplus exception is not caught by api.errorhandlerapi.errorhandler 未捕获 Flask restplus 异常
【发布时间】:2020-09-04 10:44:19
【问题描述】:

我想为 Flask-restful API 定义自定义错误处理

烧瓶自定义错误(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'})

exceptions.py

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

【问题讨论】:

标签: python flask flask-restful flask-restplus


【解决方案1】:

遇到了同样的问题,我最终使用了 Flask 中的 abort 方法。我不知道它是否适合您的用例,但请尝试一下。

from flask import abort 

def cal_test(self,reqdata):
    if self.test_name == reqdata['test']:
        return "Successfull"
    else:
        abort(404, "A generic error")

【讨论】:

    猜你喜欢
    • 2018-06-17
    • 2019-11-30
    • 2018-03-03
    • 1970-01-01
    • 2010-09-28
    • 2012-05-31
    相关资源
    最近更新 更多