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を使用できますがflask.abort(whatever)、メッセージをカスタマイズする可能性はありませんね。

4

1 に答える 1

2

flask.abort(http_code)http コードだけを返します。おそらく、次のコードは使用できません。

return u'Your message there', 404

jqxhr.responseTextandjqxhr.responseXMLは、エラーおよびリダイレクト応答に対して空の文字列または null を返す必要があるためです。

いつでも別の http エラー ステータスでメッセージを作成することができますが、これにはいくつかの制限があり、別の http ステータスとメッセージがある場合に混乱する可能性があります。

doneしたがって、 jquery ajax メソッドを処理し、応答ステータス コードに追加する 200 http ステータスを使用できます。

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 に答える