Flask_WTF csrf装饰器属性错误

时间:2016-02-26 04:51:15

标签: javascript ajax flask flask-wtforms

我使用flask_wtf来保护不是表单但是从JavaScript发布Ajax数据的网页。

我得到一个'AttributeError:'模块'对象没有'@ csrf.error_handler'装饰器的属性'error_handler'',并且无法解决原因。

Flask服务器上的

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 个答案:

答案 0 :(得分: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)