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

Mar*_*oni 13 python jquery 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);
            },
    },
});
Run Code Online (Sandbox Code Playgroud)

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

response = HTTPBadRequest(body=str(error_dict)))
response.content_type = 'application/json'
return response
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*kel 27

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

import json
out = json.dumps(error_dict)
Run Code Online (Sandbox Code Playgroud)

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

@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
    }
Run Code Online (Sandbox Code Playgroud)

如果您想自己创建响应,那么:

response = HTTPBadRequest()
response.body = json.dumps(error_dict)
response.content_type = 'application/json'
return response
Run Code Online (Sandbox Code Playgroud)

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

curl -i <url>
Run Code Online (Sandbox Code Playgroud)

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