2017-01-20 4 views
0

私は実際にフラスコで作業しています。 私はフラスコを使ってサーバーを稼動させています。これはクロム拡張(js)によって要求されます。flask.abort()は正確に何をしますか?

拡張からサーバーを要求するのは簡単です:私はchrome.runtime.sendMessage()メソッドを使用します。このメソッドは、JSONオブジェクト(サーバーからの応答)をパラメータとして取得するコールバック関数も提供します。

例えば、私は私のサーバー上でこのルートを持っていることとします

@app.route('/users', methods=['POST']) 
    def api_login(): 
     if 'username' not in request.json : 
      return jsonify(success=false) 
     else : 
      return jsonify(success=true) 

その後、私は私のextenstionにすることができ、より正確には、コールバック関数では、成功値チェック:

function(response) { 
    if(response.success){ 
     console.log("Login ok !") 
    } 
} 

しかし、私のチームはもうこれに頼ることを望まず、代わりにhttpエラーコードを使用したいと考えています。フラスコにはアボート機能がありますが、マニュアルを読んでいるうちに、実際に何ができるか理解するのに苦労しました。私の経路を呼び出すとき:

else: 
    abort(422, {"error":"Missing parameters"}) 

拡張子(js)でこれらの情報をどのように使うことができますか?アボートが呼び出されると、フラスコは特定のJSONオブジェクトを自動的に返しますか?エラーコードを確認するにはどうしたらいいですか?私は、クライアントコードでそのような何かをしたいと思います:(アボートについてのすべてのStackOverflowスレッドを読んで、私が持っている手がかりの

if(response.status == 422) { 
    console.log("Error") 
} 

ワン)デコレータする@ app.errorhandlerを使用して、特定のエラー関数を定義することです(コード):

@app.errorhandler(422) 
def myErrorCase(error): 
    return jsonify(status=422, error="missing parameters") 

しかし、私はもっと簡単な方法があると仮定します。

ありがとうございました。

答えて

1

この例ではJQueryを使用していますが、これは簡単であり、ストレスやブラウザ間の問題がたくさんあるためです。

あなたがすでに行っているようにエラーコードを渡すだけなら、Werkzeugはエラーメッセージをhtmlでラップします(ただし、正規表現を使用してクライアント側でエラーメッセージを抽出することはできますが、 )。 はありませんので、フラスコを自動的にクライアントに戻って

フラスコabort方法をJSON文字列を返すのいずれかのエラーコードを受け入れるか、それがResponseオブジェクトを受け入れることができません。あなたがしたいことを達成するには、Responseオブジェクトをabortメソッドに渡す必要があります。

レスポンスオブジェクトはあなただけ作成したい場合ので、あなたはResponseクラスをいじる必要はありませんwerkzeug.wrappers.Responseオブジェクトも

ありmake_responseと呼ばれるレスポンスオブジェクトを作成するためのヘルパーメソッドのラッパーですシンプルResponseオブジェクト

あなたが応答にカスタムヘッダーを追加したり、012デフォルトのヘッダを変更する必要があるときは、代わりにrender_templateabortがあなたのためにそれを行うことが可能でResponseオブジェクトを作成します理由の一つでありますが応答に追加されます。あなたはまだからこれを行うことができますstatusCode

の下で彼らのために対応する関数を定義することによって、異なるエラーコードを扱うことができる

app.py

from flask import Flask, abort, render_template, Response 
from json import dumps 

app = Flask(__name__) 

@app.route('/') 
def home(): 
    return render_template('client.html') 

@app.route('/resource') 
def resource(): 
    error_message = dumps({'Message': 'You cannot see this!!!'}) 
    abort(Response(error_message, 401)) 

if __name__ == '__main__': 
    app.run() 

client.html

<html> 
    <head> 
    <title></title> 
    <meta content=""> 
    <style></style> 

    <script 
     src="https://code.jquery.com/jquery-3.1.1.min.js" 
     integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" 
     crossorigin="anonymous"> 
    </script> 
    </head> 
    <body> 

    <script> 
    $.ajax({ 
      url: 'http://localhost:5000/resource', 
      dataType: 'json', 
      success: function(data){ 
       alert('Your request was successful'); 
      }, 

      statusCode: { 
      401: function (response) { 
       error = JSON.parse(response.responseText) 
       alert(error.Message) 

      } 
      } 
     }); 
    </script> 
    </body> 
</html> 

純粋なJavascriptは、それだけでより多くのキーストロークを伴います。

abortと例外が一般的にどのように処理されるかを理解するには、werkzeugのソースコードをよく読んでください。 This would be a good starting point

関連する問題