在金字塔中如何用json数据返回400响应?

时间:2011-07-20 05:56:26

标签: jquery python pyramid

我有以下jquery代码:

$.ajax({
    type: 'POST',
    url: url,
    data: data,
    dataType: 'json',
    statusCode: {
        200: function (data, textStatus, jqXHR) {
                console.log(data);
            },
        201: function (data, textStatus, jqXHR) {
                 log(data);
            },
        400: function(data, textStatus, jqXHR) {
                log(data);
            },
    },
});

当后端(金字塔)中的验证失败时使用400。现在从Pyramid我如何返回HTTPBadRequest()响应以及包含验证错误的json数据?我试过像:

response = HTTPBadRequest(body=str(error_dict)))
response.content_type = 'application/json'
return response

但是当我在firebug中检查时,它会返回400(错误请求),这是好的,但它从不解析上面data.responseText的json响应。

3 个答案:

答案 0 :(得分:27)

那么你应该从使用json库序列化error_dict开始。

import json
out = json.dumps(error_dict)

鉴于您没有提供有关视图设置方式的任何上下文,我只能告诉您我将如何操作:

@view_config(route_name='some_route', renderer='json')
def myview(request):
    if #stuff fails to validate:
        error_dict = # the dict
        request.response.status = 400
        return {'errors': error_dict}

    return {
        # valid data
    }

如果您想自己创建回复,请:

response = HTTPBadRequest()
response.body = json.dumps(error_dict)
response.content_type = 'application/json'
return response

要调试此问题,请根据jQuery是否正常工作停止运行,并自行查看请求以确定Pyramid是否正常运行,或者是否正在进行其他操作。

curl -i <url>

甚至只需在浏览器中打开调试器即可查看响应中返回的内容。

答案 1 :(得分:1)

我找到了一种简单的方法来做到更通用然后接受的答案,我用这个代码

我在视图中包含了exception_response

from pyramid.httpexceptions import exception_response

我提出了我需要的400异常

 raise exception_response(400)

在我的异常脚本中,我捕获所有异常以返回泛型json,并且我捕获400以返回特定的json

from pyramid.view import exception_view_config

from pyramid.httpexceptions import (
    HTTPException,
    HTTPBadRequest
)


@exception_view_config(HTTPException, renderer='json')
def exc_view_exception(message, request):
    return {'error': str(message)}


@exception_view_config(HTTPBadRequest, renderer='json')
# Exception 400 bad request
def exc_view_bad_request(message, request):
    body = {
        "message": str(message),
        "status": 400
    }
    request.response.status = 400
    return body

答案 2 :(得分:0)

您可以更改响应状态代码,如下所示:request.response.status_code = 400.以下示例适用于我

@view_config(route_name='qiwiSearch', request_method='GET', renderer='json')
def qiwiSearchGet(request):
    schema = SchemaQiwiSearchParams()
    try:
        params = schema.deserialize(request.GET)
    except colander.Invalid, e:
        errors = e.asdict()
        request.response.status_code = 400
        return dict(code=400, status='error', message=unicode(errors))

    log.debug(u'qiwiSearchGet: %s' % params)
    return dict(code=200, status='success', message='', data=[1,2,3])
相关问题