2016-04-15 101 views
0

我已经开始与python-flaskangular和我已经使用this snippet来处理csrf。用ajax调用它总是给我403错误。我没有得到,我在这里做错了什么。 我已经经历了很多答案,并尝试了google search中的所有选项。但没有运气。我没有得到我犯错的地方。烧瓶和csrf标记

瓶代码:

@app.route('/targetapi/', methods=['POST']) 
def fetch_targets(): 
    """ """ 
    data_dict = {} 
    acc_ids = request.args['acc_ids'] 
    data_dict['username'] = session.get('username') 
    data_dict['targets'] = some_func(acc_ids) 
    return jsonify(data_dict) 

角码: HTML页:

<input name="_csrf_token" type=hidden ng-model="csrf_token" ng-init="csrf_token='{{ csrf_token() }}'" > 

Ajax调用:

$http({ 
     method : "POST", 
     url : '/targetapi/', 
     headers : { xsrfHeaderName: 'X-CSRFToken', xsrfCookieName : csrf_token }, 
     data : { acc_ids : accountIDs }     
}) 

不知道为什么我得到403禁止响应:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 
<title>403 Forbidden</title> 
<h1>Forbidden</h1> 
<p>You don't have the permission to access the requested resource. It is either read-protected or not readable by the server.</p> 

* Chrome-Developer工具粘贴的响应

+0

你如何设置Flask来防止CSRF?瓶,跆拳道?烧瓶SeaSurf?其他一些方法? –

+0

@JakubP。 - flask_wtf – trex

+0

假设1)您仔细阅读了所有http://flask-wtf.readthedocs.org/en/latest/csrf.html和2)AJAX调用实际上具有X-CSRFToken标头,其中具有适当的值在Flask模板中插入的HTML页面,以及3)您的flask_wtf配置没有从默认(http://flask-wtf.readthedocs.org/en/latest/config.html)更改,那么我没有线索...如果你可以把一个最小的工作演示放在一起,我可以尝试在我自己的机器上进行调试......(注意0.9.0版本的要求) –

回答

1

检查Chrome是否在发布请求之前发送选项请求。如果是这样,你可以尝试这样的事情:

from flask import current_app 

    @app.route('/targetapi/', methods=['POST', 'OPTIONS']) 
    def fetch_targets(): 
     if request.method=='OPTIONS': 
      response = current_app.make_default_options_response() 
     else: 
      data_dict = {} 
      acc_ids = request.args['acc_ids'] 
      data_dict['username'] = session.get('username') 
      data_dict['targets'] = some_func(acc_ids) 
      return jsonify(data_dict)