【问题标题】:Flask: 'Response' object is not iterable with response-producing exceptionsFlask:“响应”对象不可迭代,产生响应的异常
【发布时间】:2014-04-28 21:03:00
【问题描述】:

在 Flask 0.10.1 中,我似乎无法再从异常中生成响应(0.9 也是如此)。这段代码:

from flask import Flask, jsonify
from werkzeug.exceptions import HTTPException
import flask, werkzeug

print 'Flask version: %s' % flask.__version__
print 'Werkzeug version: %s' % werkzeug.__version__

app = Flask(__name__)
app.config['PROPAGATE_EXCEPTIONS'] = True

class JSONException(HTTPException):
    response = None

    def get_body(self, environ):
        return jsonify(a=1)

    def get_headers(self, environ):
        return [('Content-Type', 'application/json')]

@app.route('/x')
def x():
    return jsonify(a=1)

@app.route('/y')
def y():
    raise JSONException()

c = app.test_client()
r = c.get('x')
print r.data
r = c.get('y')
print r.data

打印

Flask version: 0.10.1
Werkzeug version: 0.9.4
{
  "a": 1
}
Traceback (most recent call last):
  File "flask_error.py", line 33, in <module>
    print r.data
  File "/home/path/lib/python2.7/site-packages/werkzeug/wrappers.py", line 881, in get_data
    self._ensure_sequence()
  File "/home/path/lib/python2.7/site-packages/werkzeug/wrappers.py", line 938, in _ensure_sequence
    self.make_sequence()
  File "/home/path/lib/python2.7/site-packages/werkzeug/wrappers.py", line 953, in make_sequence
    self.response = list(self.iter_encoded())
  File "/home/path/lib/python2.7/site-packages/werkzeug/wrappers.py", line 81, in _iter_encoded
    for item in iterable:
  File "/home/path/lib/python2.7/site-packages/werkzeug/wsgi.py", line 682, in __next__
    return self._next()
  File "/home/path/lib/python2.7/site-packages/werkzeug/wrappers.py", line 81, in _iter_encoded
    for item in iterable:
  File "/home/path/lib/python2.7/site-packages/werkzeug/wsgi.py", line 682, in __next__
    return self._next()
  File "/home/path/lib/python2.7/site-packages/werkzeug/wrappers.py", line 81, in _iter_encoded
    for item in iterable:
TypeError: 'Response' object is not iterable

回溯是意外的。

【问题讨论】:

    标签: python flask werkzeug


    【解决方案1】:

    jsonify() 产生一个完整的响应对象,而不是响应正文,所以使用HTTPException.get_response(),而不是.get_body()

    class JSONException(HTTPException):    
        def get_response(self, environ):
            return jsonify(a=1)
    

    另一种方法是只使用json.dumps() 在此处生成正文:

    class JSONException(HTTPException):
        def get_body(self, environ):
            return json.dumps({a: 1})
    
        def get_headers(self, environ):
            return [('Content-Type', 'application/json')]
    

    【讨论】:

    • 我刚试过这个,关于 jsonify (?) 得到“RuntimeError: working outside of application context”。
    • @szeitlin:那么您在哪里提出异常以及在哪里处理它?
    猜你喜欢
    • 2013-06-13
    • 2022-11-29
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多