0

我的 Flask 应用程序的模板有一段 javascript (jQuery) 代码,一旦触发,它将尝试在给定路由上发布一些数据:

var jqxhr = $.post($SCRIPT_ROOT+endpoint,
                   post_data,
                   function() {
                   alert("Yays!"); })
                    .done(function() { ...finalize_client... })
                    .fail(function (jqxhr, textStatus, err) {
                            alert("Our server returned an error\n" + err +
                                  "\n" + textStatus + "\n" +
                                  "Please try again later.");
                          });
        };

服务器端endpoint对应的函数如下

@mod.route(endpoint, methods=['POST',])
def validate_post_data():
    ...
    test = validation_function(post_data)
    if test:
        ...finalize_server...
        return render_template(...)
    return ???   

检查 的有效性post_data。如果验证失败,我想向客户端发送一些消息,以便我们可以更多地了解出了什么问题。我应该返回什么以便我可以在 js 代码中获得我需要的err和?textStatus我可以使用 a flask.abort(whatever),但这并不能让我自定义消息,是吗?

4

1 回答 1

2

flask.abort(http_code)只返回 http 代码,可能你不能使用下一个代码:

return u'Your message there', 404

因为jqxhr.responseText并且jqxhr.responseXML必须为错误和重定向响应返回空字符串或 null。

您始终可以尝试通过不同的 http 错误状态生成消息,但是当您有不同的 http 状态和消息时,这可能会有一些限制和混淆。

因此,您可以使用 200 http status 来处理donejquery ajax 方法并添加到响应状态代码:

var jqxhr = $.post($SCRIPT_ROOT+endpoint, post_data, function() {
   alert("Yays!");
})
.done(function(data) {
    if (data.status === 'ok') {
        //...finalize_client... with data.response 
    } else {
        alert("Our server returned an error\n" + data.error +
              "\n" + data.status + "\n" +
              "Please try again later.");
    }
})
.fail(function (jqxhr, textStatus, err) {
    alert("Our server returned an error\n" + err +
          "\n" + textStatus + "\n" +
          "Please try again later.");
});

@mod.route(endpoint, methods=['POST',])
def validate_post_data():
    ...
    test = validation_function(post_data)
    if test:
        ...finalize_server...
        return jsonify(status='ok', response=render_template(...))
    return jsonify(status='error', error='not valid data')

或者只是检查响应:

var jqxhr = $.post($SCRIPT_ROOT+endpoint, post_data, function() {
   alert("Yays!");
})
.done(function(data) {
    if (data !== 'something wrong') {
        //...finalize_client...
    } else {
        alert("Our server returned an error\n" + data +
              "\n"
              "Please try again later.");
    }
})
.fail(function (jqxhr, textStatus, err) {
    alert("Our server returned an error\n" + err +
          "\n" + textStatus + "\n" +
          "Please try again later.");
});

@mod.route(endpoint, methods=['POST',])
def validate_post_data():
    ...
    test = validation_function(post_data)
    if test:
        ...finalize_server...
        return response=render_template(...)
    return 'something wrong'
于 2013-06-12T10:55:22.183 回答