【问题标题】:Customizing a POST failure message in Flask+jQuery在 Flask+jQuery 中自定义 POST 失败消息
【发布时间】:2013-06-11 08:49:55
【问题描述】:

我的 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 代码中获得我需要的 errtextStatus?我可以使用flask.abort(whatever),但这不能让我自定义消息,是吗?

【问题讨论】:

    标签: jquery post flask


    【解决方案1】:

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

    return u'Your message there', 404
    

    因为 jqxhr.responseTextjqxhr.responseXML 必须返回空字符串或 null 以表示错误和重定向响应。

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

    因此您可以使用 200 个 http 状态来处理 done jquery 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'
    

    【讨论】:

    • 哦,这是个好主意。既然您指出失败应该返回一个带有状态码的空字符串,这是有道理的:我们应该区分 validation_function 返回 False 的情况(意味着实际处理了 POST,“已知失败”)和以下情况它根本没有被调用(POST失败,某处的语法错误:'未知失败')......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2021-05-19
    • 2014-10-19
    • 2017-06-23
    • 2011-09-21
    • 2011-09-05
    相关资源
    最近更新 更多