web-dev-qa-db-ja.com

Flask、ajax呼び出しの成功ステータスコードを返す方法

サーバー側では、json-as-dictionaryをコンソールに出力しています

@app.route('/',methods=['GET','POST'])
@login_required
def index():
    if request.method == "POST":
        print request.json.keys()
    return "hello world"

これで、ajaxを介して投稿要求を行うたびに、コンソールは必要なコンテンツを含む辞書を出力します。

クライアント側では、さまざまなメソッドを使用して、成功したajax呼び出しに基づいてjqueryを実行しようとしています。私はちょうどこれが私のサーバー側のエラーかもしれないことに気付きました、つまり、私はそのjjax呼び出しが成功したことをjqueryに伝えるためにリクエストヘッダーを送信していません。

それでは、OKステータスをクライアントに返送して、すべてが正常であることを伝えるにはどうすればよいですか?

完全を期すために、ここに私のクライアントサイドのコードがあります

$.ajax({
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(myData),
    dataType: 'json',
    url: '/',
    success: function () {
        console.log("This is never getting printed!!")
    }});
44
yayu

応答について Flaskの場合:

応答について

ビュー関数からの戻り値は、自動的に応答オブジェクトに変換されます。戻り値が文字列の場合、応答本文としての文字列、200 OKステータスコード、およびtext/html mimetypeを持つ応答オブジェクトに変換されます。 Flask=が戻り値を応答オブジェクトに変換するのに適用されるロジックは次のとおりです。

  1. 正しいタイプの応答オブジェクトが返される場合、それはビューから直接返されます。
  2. 文字列の場合、そのデータとデフォルトのパラメーターを使用して応答オブジェクトが作成されます。
  3. タプルが返される場合、タプル内のアイテムは追加情報を提供できます。そのようなタプルは(response, status, headers)または(response, headers)の形式である必要があり、少なくとも1つのアイテムがタプルにある必要があります。 status値はステータスコードをオーバーライドし、headersは追加のヘッダー値のリストまたは辞書にすることができます。
  4. いずれも機能しない場合、Flaskは戻り値が有効なWSGIアプリケーションであると想定し、それを応答オブジェクトに変換します。

したがって、(実行中に)テキスト文字列を返す場合、AJAX呼び出しが受信する必要があるステータスコードは200 OKであり、成功コールバックが実行されている必要があります。次のようなJSON形式の応答を返すことをお勧めします。

return json.dumps({'success':True}), 200, {'ContentType':'application/json'} 
55
aabilio

aabilio's answer のオプションとして、FlaskでContent-Typeを自動的に設定するjsonifyメソッドを使用できます。

from flask import jsonify

resp = jsonify(success=True)
return resp

(オプションで)応答コードを明示的に設定できます。

resp.status_code = 200
15

既に投稿された回答に加えて、ステータスを返す必要がある場合は特に、Flask(バージョン0.6以降)で make_response メソッドを使用するとより明確な代替手段になりますFlaskのAPIの応答JSONを使用したコード:

from flask import jsonify, make_response

# ... other code ...
data = {'message': 'Created', 'code': 'SUCCESS'}
return make_response(jsonify(data), 201)

また、このアプローチはContent-Typeヘッダーをapplication/jsonに自動的に設定します。

2
seyisulu