Обработка исключений колб и мимендер

Я использую отображение исключений из mimerender (давайте возьмем json в качестве примера), однако вывод отличается от того, когда работает запрос:

import json
import mimerender
...

mimerender = mimerender.FlaskMimeRender()

render_xml = lambda message: '<message>%s</message>'%message
render_json = lambda **args: json.dumps(args)
render_html = lambda message: '<html><body>%s</body></html>'%message
render_txt = lambda message: message

render_xml_exception = lambda exception: '<exception>%s</exception>'%exception
render_json_exception = lambda exception: json.dumps(exception.args)
render_html_exception = lambda exception: '<html><body>%s</body></html>'%exception
render_txt_exception = lambda exception: exception

@mimerender.map_exceptions(
    mapping=(
        (ValueError, '500 Internal Server Error'),
        (NotFound, '404 Not Found'),
    ),
    default = 'json',
    html = render_html_exception,
    xml  = render_xml_exception,
    json = render_json_exception,
    txt  = render_txt_exception
)
@mimerender(
    default = 'json',
    html = render_html,
    xml  = render_xml,
    json = render_json,
    txt  = render_txt
)
def test(...

Когда запрос работает, я получаю этот ответ:

* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: application/json
< Content-Length: 29
< Vary: Accept
< Server: Werkzeug/0.8.3 Python/2.7.3rc2
< Date: Tue, 20 Nov 2012 19:27:30 GMT
< 
* Closing connection #0
{"message": "Success"}

Когда запрос не выполняется и возникает исключение:

* HTTP 1.0, assume close after body
< HTTP/1.0 401 Not Found
< Content-Type: application/json
< Content-Length: 25
< Vary: Accept 
< Server: Werkzeug/0.8.3 Python/2.7.3rc2
< Date: Tue, 20 Nov 2012 19:16:45 GMT
< 
* Closing connection #0
["Not found"]

Мой вопрос: за исключением того, что мне нужен такой же вывод, как здесь:

{'message': 'Not found'}

Как этого достичь?

1 ответ

Очевидно exception.args это список, и он возвращается как таковой:-) Чтобы изменить это, просто измените структуру данных, которую вы возвращаете.

Другими словами, измените:

render_json_exception = lambda exception: json.dumps(exception.args)

чтобы:

render_json_exception = lambda exception: json.dumps({"message": exception.args})

Или, если вы должны вернуть только одно сообщение об ошибке:

render_json_exception = lambda exception: json.dumps({"message": " - ".join(exception.args)})
Другие вопросы по тегам