■目的
画面更新せずに、データのみを登録したいという動きを
サーバー側Flask、クライアント側ajaxを利用した環境での実装を行う必要あり。
■問題
jQueryのajaxで呼び出したときに
データの登録のみをWebサービスで行いたいのに
Flask側で画面展開されてしまう。
Html側
$("#ajaxstart").click(function(){
$.ajax({
type: "POST",
url: "/hoge/",
datatype:"json" ,
contentType:'application/json',
data: {objid:$('form#hogehoge').attr('value'),
},
}).done(function(data, status, xhr) {
}).fail(function(xhr, status, error) {
}).always(function(arg1, status, arg2) {
});
});
Flask,Python側
@app.route('/hoge/', methods=['POST'])
def hoge():
# オブジェクトの入手
objid = Mongodb().objectid(request.form['hogehoge'])
response = Response()
return response
■対策
返答するresponseにコンテンツはないことを明示的に表現する必要があり。
Flask,Python側
@app.route('/hoge/', methods=['POST'])
def hoge():
# オブジェクトの入手
objid = Mongodb().objectid(request.form['hogehoge'])
response = Response()
# ステータスコードは NoContent (204)
response.status_code = 204
return response
■参考
resoponse.status_codeはほかにもいろいろあるみたいです。
詳しくはここいらで。
本当に204で正解は少し疑問
Python の Flask で REST API を作ってみる
WikiPedia
■追伸
どうも違ったみたいです。
formのactionのpostと、.ajaxでリクエストが二つ飛んでいました。
postのほうが画面をredirectで作っていたようです。最終的にはstatus_code指定しなくても大丈夫でした。
教訓:submitは要注意、目指すページの構成によって使い分けるべし。