■目的
画面更新せずに、データのみを登録したいという動きをサーバー側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は要注意、目指すページの構成によって使い分けるべし。
0 件のコメント :
コメントを投稿