Flask-WTF CSRF 保護 & ajax 400 解決方法

一、配置

from flask_wtf.csrf import CSRFProtect

...
csrf = CSRFProtect()
csrf.init_app(app)
...



1、如果模板中存在表單,不需要做任何事情,與之前一個樣:

<form method="post" action="">
     {{ form.csrf_token }}
</form>



2、但如果模板中沒有表單,你仍然需要一個CSRF令牌:

<form method="post" action="">
     <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
</form>



3、只要沒通過CSRF驗證,都會返回400 相應(yīng),比如ajax調(diào)用。我們 可以自定義這個錯誤相應(yīng)

@csrf.error_handler
def csrf_error(reason):
    return render_template("csrf_error.html",reason=reason), 400



4、強烈建議對所有視圖啟用CSRF保護。但也提供了某些視圖函數(shù)不需要保護的裝飾器:

@csrf.exempt
@blueprint.route('/foo',methods=["GET","POST"])
def my_handler():
   ...
    return jsonify()


二、AJAX

1、假設(shè)已經(jīng)使用了CSRFProtect(app), 你可以通過 {{ csrf_token() }} 獲取CSRF令牌。這個方法在每個模板中都可以使用,并不需要擔心在沒有表單時如何渲染CSRF令牌字段。
這里推薦的方式是在<meta> 標簽中渲染CSRF令牌:

<meta name="csrf-token" content="{{ csrf_token() }}"

或在<script>標簽中渲染同樣可行:

<script type="text/javascript">
    var csrftoken="{{ csrf_token() }}"
</script>



2、下面例子采用了在<meta>標簽渲染的方式,在<script>中渲染會更簡單,你無須擔心沒有響應(yīng)的例子。
無論何時發(fā)送 AJAX POST 請求,為其添加 X-CSRFToken 頭:

var csrftoken = $('meta[name=csrf-token]').attr('content');

$.ajaxSetup({
    url: "#",
    type: "POST",
    traditional: true,
    dataType:"json",
    contentType: "application/json",
     data: JSON.stringify({         // 此處必須作json轉(zhuǎn)換
                    "varA": $("#varA").val(),
                    "varB":$("#varB").val(),
                    "varC":$("#varC").val(),
                }),
    beforeSend: function(xhr, settings) {
        if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken)
        }
    }
})

接下來后臺就可以取數(shù)據(jù)了

request.get_json()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容