一、配置
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()