2016-04-15 17 views
0

Я начал с python-flask и angular, и я использовал 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 Forbidden ответ:

<!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 Tool

+0

Как вы устанавливаете флажок для защиты от CSRF? Колба-WTF? Колба-SeaSurf? Какой-то другой метод? –

+0

@JakubP. - flask_wtf – trex

+0

Предполагая, что 1) вы внимательно прочитали все http://flask-wtf.readthedocs.org/en/latest/csrf.html и 2), вызов AJAX на самом деле имеет заголовок X-CSRFToken с правильным значением из HTML-страница, вставленная в шаблон Flask, и 3) ваша конфигурация flask_wtf не изменена по умолчанию (http://flask-wtf.readthedocs.org/en/latest/config.html), тогда у меня нет подсказки ... if вы могли бы собрать минимальную рабочую демоверсию, которую я мог бы попробовать отлаживать на своей машине ... (обратите внимание на потребность в версии 0.9.0) –

ответ

1

Проверьте, Chrome отправляет запрос Options перед запросом Post. Если это так, вы можете попробовать что-то вроде:

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) 
Смежные вопросы