2014年5月6日火曜日

FlaskでのWebサービスでの投げっぱなしのPOSTをやってみた。


■目的

画面更新せずに、データのみを登録したいという動きを
サーバー側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 件のコメント :

コメントを投稿