当我预计500

时间:2015-11-07 15:52:45

标签: python api flask

我有一个Flask API,它是客户服务API的包装器。我使用发电机来保持低内存开销。前几天我注意到第三方已经从他们的API中删除了一个密钥,这导致call_cs_api抛出异常。我希望Flask会因此抛出500错误,但它会返回200.所以,我改变了我的生成器以处理异常,如下所示(解决方案来自here)。

然而,即使有这样的添加,并且werkzeug承认500错误,当我卷曲该端点时,我仍然得到200返回给我。

奇怪的是,如果我打开app.run()并从main而不是通过uwsgi运行程序,则成功返回500 。所以也许它是我不知道的瓶子。这是代码和一些日志跟踪:

首先,处理从第三方登录/检索数据的类:

def call_cs_api(self):
    req = requests.get(self.url)
    resp = json.loads(req.text)
    for case in resp['_embedded']['entries']:
            case = self.cleanse_data(case)
            yield (case, None)
    if next_call:
        print next_call
        try:
            print req.headers['Rate-Limit-Remaining']
            print req.headers['Rate-Limit-Reset']
            if req.headers['Rate-Limit-Remaining'] == 0:
                sleep(int(req.headers['X-Rate-Limit-Reset'])+2)
        except KeyError, e:
            yield (None, e)
        self.url = next_call['href']
        for call in self.call_cs_api():
            yield call

我的Flask api:

from flask import Flask, abort, Response
import cs_api

@application.route('/users', methods = ['GET'])
def users():
    api = cs_api.CSApi('users')
    def generate():
        cases = api.call_cs_api()
        for case,e in cases:
            if case:
                yield json.dumps(case)
            if e:
                abort(500)
    return Response(generate())

@application.errorhandler(500)
    def internal_error(error):
    return "500 error - Internal Server Exception"

堆栈跟踪。最后两行显示500/200不一致:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/wsgi.py", line 682, in __next__
    return self._next()
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/wrappers.py", line 81, in _iter_encoded
      for item in iterable:
  File "cs_handler.py", line 31, in generate
      abort(500)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/exceptions.py", line 576, in __call__
      raise self.mapping[code](*args, **kwargs)
  werkzeug.exceptions.InternalServerError: 500: Internal Server Error
  [pid: 20937|app: 0|req: 1/1] 10.100.100.51 () {38 vars in 463 bytes} [Sat Nov  7 15:25:37 2015] GET /users => generated 53529 bytes in 481 msecs (HTTP/1.1 200) 1 headers in 59 bytes (50 switches on core 0)

2 个答案:

答案 0 :(得分:2)

错误处理程序的工作方式与普通视图功能类似。如果您未设置响应代码,则默认值为200

返回500错误代码作为第二个参数。

@application.errorhandler(500) def internal_error(error): return "500 error - Internal Server Exception", 500

答案 1 :(得分:0)

虽然 Iurisilvio 的回答很完美,但我认为给出一个更好的代码的例子可能会对某人有所帮助。

@app.errorhandler(400)
def notFound(error):
    return jsonify({
           "success": False, 
           "error": 400,
           "message": "bad request"
           }), 400