2016-08-19 8 views
0

私はフラスコのフラスコとフラスコのリミッタとAngularJSを使用しています。すべてがうまくいきますが、私が望むのはフロントエンドで429リクエストメッセージが多すぎます。フラスコのCORSとフラスコのリミッタ

function(response){ 
    var res_data = (response.data && response.data.data) ? response.data.data : null; 
    var res_status = response.status; 
    FlashService.Error(response[keys.issue_fields], true); 
    if (res_status == 513 && res_data && res_data[keys.issue_fields][0] == keys.email) { 
     vm.error = "Your email is not recognized. Please try again."; 
    } else if (res_status == 513 && res_data && res_data[keys.issue_fields][0] == keys.password){ 
     vm.error = "Your email and password combination was incorrect. Please try again."; 
    } else if (res_status == 513 && res_data && res_data[keys.issue_fields][0] == keys.suspension){ 
     vm.error = "Your account is inactive."; 
    }else if (res_status == 429) { 
     vm.error = "You have attempted a numerous login failed attempt.. Please try again later."; 
    }else if (res_status == -1) { 
     vm.error = "Server Error. Please try again later."; 
    }else { 
     vm.error = "Your email and password combination was incorrect. Please try again."; 
    } 
    vm.dataLoading = false; 
}); 

これは私のフラスココードです:「tはそれが429

マイAngularJSエラー応答コードを返したら、OPTIONSメソッドのブロックのすべてのためにそれを行うように見える

@user_manager.route('/login/dp', methods=['POST']) 
#make sure limit_key is changed if modify limit since it is hard coded 
@limiter.limit("5/15minute") 
def login_dp(): 
    if key.email() in request.form and key.password() in request.form: 
     user_id = CBDPUserDatabase().login(request.form[key.email()], request.form[key.password()]) 
     if user_id > 0: 
      limit_key = 'LIMITER/%s/%s/10/15/minute' % (get_ipaddr(), request.endpoint) 
      if limit_key in limiter._storage.storage: del limiter._storage.storage[limit_key] 
      if limit_key in limiter._storage.expirations: del limiter._storage.expirations[limit_key] 
      user_profile = CBDPUserDatabase().fetch_user_profile(user_id) 
      token = create_dp_token(user_id, user_profile[key.dealership()][key.id()]) 
      if user_profile is not None: 
       return ResponsePacket.success(data={key.profile(): user_profile, key.token(): token}) 
      else: 
       # Couldn't retrieve the user's profile 
       return ResponsePacket.data_exception(data={key.issue_fields(): [key.profile()]}) 
     elif user_id == -2: 
      # Email address not found in user database 
      return ResponsePacket.data_exception(data={key.issue_fields(): [key.email()]}) 
     elif user_id == -3: 
      # Password given does not match 
      return ResponsePacket.data_exception(data={key.issue_fields(): [key.password()]}) 
     elif user_id == -4: 
      return ResponsePacket.data_exception(data={key.issue_fields(): [key.suspension()]}) 

    else: 
     return ResponsePacket.request_exception() 

これは、私のCORS設定:ここでは

cors = CORS(application, resources={r"*": {"origins": "*"}}) 

は私のフラスコのログです:

127.0.0.1 - - [19/Aug/2016 08:10:02] "OPTIONS /user/login/dp HTTP/1.1" 200 - 
127.0.0.1 - - [19/Aug/2016 08:10:04] "POST /user/login/dp HTTP/1.1" 513 - 
127.0.0.1 - - [19/Aug/2016 08:10:06] "POST /user/login/dp HTTP/1.1" 513 - 
127.0.0.1 - - [19/Aug/2016 08:10:07] "POST /user/login/dp HTTP/1.1" 513 - 
127.0.0.1 - - [19/Aug/2016 08:10:08] "OPTIONS /user/login/dp HTTP/1.1" 200 - 
127.0.0.1 - - [19/Aug/2016 08:10:08] "POST /user/login/dp HTTP/1.1" 429 - 
127.0.0.1 - - [19/Aug/2016 08:10:10] "POST /user/login/dp HTTP/1.1" 429 - 
127.0.0.1 - - [19/Aug/2016 08:10:13] "OPTIONS /user/login/dp HTTP/1.1" 429 - 
127.0.0.1 - - [19/Aug/2016 08:10:22] "OPTIONS /user/login/dp HTTP/1.1" 429 - 
127.0.0.1 - - [19/Aug/2016 08:10:24] "OPTIONS /user/login/dp HTTP/1.1" 429 - 
127.0.0.1 - - [19/Aug/2016 08:10:24] "OPTIONS /user/login/dp HTTP/1.1" 429 - 
127.0.0.1 - - [19/Aug/2016 08:10:26] "OPTIONS /user/login/dp HTTP/1.1" 429 - 

ここでは、私のWebコンソールが、私は今それを得た

enter image description here

+0

アプリケーションがGETまたはPOSTリクエストを何らかの種類で実行しようとすると、ブラウザからのクロスドメインリクエストに対してプリフライトリクエストが送信されます。プリフライトが戻って来ない場合は、対応するGETまたはPOSTまたは実際に送信されないものをOKにします。ここでの問題はフラスコのリミッタ側にあります。投稿に429の応答を与えた後、429でブラウザからOPTIONS要求に応答しているので、何かがリミッターまたはリミッターは、ブロックしたい特定のルートだけに制限する必要があります。 – shaunhusain

+0

技術的な提案はありますか? –

+0

申し訳ありませんPythonやFlaskについては、実際に試してみるべきことを教えてもらえませんが、ブラウザとサーバーが角度を持って動作しなければならないということだけは、リクエストを開始しますが、実際にはブラウザはOPTIONSリクエストとフラスコサーバ、またはサーバ側に送信する責任を負うものです。 – shaunhusain

答えて

0

です!メソッドのパラメータを設定するだけです。

@limiter.limit("20/15minute", methods=['POST'])