這個問題是由跨站點僞造請求(CRSF)形成的,要完全的弄懂這個問題就要理解什麼是CRSF,以及Django提供的CSRF防禦機制是怎麼工做的。ajax
CSRF, Cross Site Request Forgery, 跨站點僞造請求。舉例來說,某個惡意的網站上有一個指向你的網站的連接,若是某個用戶已經登陸到你的網站上了,那麼當這個用戶點擊這個惡意網站上的那個連接時,就會向你的網站發來一個請求,你的網站會覺得這個請求是用戶本身發來的,其實呢,這個請求是那個惡意網站僞造的。django
django 第一次響應來自某個客戶端的請求時,會在服務器端隨機生成一個 token,把這個 token 放在 cookie 裏。而後每次 POST 請求都會帶上這個 token,這樣就能避免被 CSRF 攻擊。服務器
1.在返回的 HTTP 響應的 cookie 裏,django 會爲你添加一個 csrftoken 字段,其值爲一個自動生成的 token
2.在全部的 POST 表單時,必須包含一個 csrfmiddlewaretoken 字段 (只須要在模板里加一個 tag, django 就會自動幫你生成,見下面)
3.在處理 POST 請求以前,django 會驗證這個請求的 cookie 裏的 csrftoken 字段的值和提交的表單裏的 csrfmiddlewaretoken 字段的值是否一 樣。若是同樣,則代表這是一個合法的請求,不然,這個請求多是來自於別人的 csrf 攻擊,返回 403 Forbidden.
4.在全部 ajax POST 請求裏,添加一個 X-CSRFTOKEN header,其值爲 cookie 裏的 csrftoken 的值cookie
1.在全部的 POST 表單元素時,須要加上一個 {% csrf_token %} 標籤
2.要啓用 django.middleware.csrf.CsrfViewMiddleware 這個中間件
3.每次發 ajax POST 請求,都須要加一個 X_CSRFTOKEN 的 header網站