2016-02-26 80 views
0

我正在使用flask_wtf來保護不是表單的網頁,而是用於從JavaScript發佈Ajax數據的網頁。Flask_WTF csrf裝飾器屬性錯誤

我得到一個'AttributeError:'模塊'對象沒有屬性'error_handler'''@ csrf.error_handler'裝飾器,並不能解決原因。

的瓶服務器上

from flask_wtf import csrf 
app = Flask(__name__) 
app.config.from_object(config) 
csrf.CsrfProtect(app) 

@csrf.error_handler 
def csrf_error(reason): 
    return render_template('404.html', reason=reason) 

@app.route('/completed/') 
def completed(results, methods=['POST']): 
    data = str(request.form['data']) 

的JavaScript:

function sendAjax(data){ 
    //@param data: JSON stringified object 
    var csrfToken = document.getElementsByName("csrf_token").getAttribute("content"); 
    var xhr = new XMLHttpRequest(); 
    xhr.open('PUT', '/completed'); 
    xhr.setRequestHeader('Content-Type', 'application/json'); 
    xhr.onload = function() { 
     if (xhr.status === 200) { 
      var userInfo = JSON.parse(xhr.responseText); 
     } 
    }; 
    xhr.send(data); 
} 

HTML:

<!-- 'form' with hidden field just so can post data back to server --> 
<form method="post" action="{{ url_for('completed') }}"> 
    <meta id="csrf_token" content="{{ csrf_token() }}" /> 
</form> 

回答

1

您需要將錯誤處理程序與你的CsrfProtect實例相關聯。

from flask_wtf.csrf import CsrfProtect 

app = Flask(__name__) 
csrf = CsrfProtect(app) 

@csrf.error_handler 
def csrf_error(reason): 
    return render_template('404.html', reason=reason)