2011-11-13 61 views
2

我很好奇:我知道在Django中有兩種csrf保護方式:{% csrf_token %}模板和@csrf_protect在視圖中。Django {%csrf_token%}或@csrf_protect

所以,問題是:它們是可以互換的嗎?我的意思是我可以使用例如只@csrf_protect我的意見沒有{% csrf_token %}標籤在我的模板和效果會一樣嗎?

我問,因爲我在最近Django項目使用鯖並沒有這樣的標記作爲{% csrf_token %} ...

謝謝!

+0

1.'{%csrf_token%}'必須存在於模板2.視圖應該由'@ csrf_protect'或'CSRF中間件'保護。 如果您使用的是其他模板引擎或AJAX,則需要在模板上下文中提供csrf標記。請閱讀:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#other-template-engines – Medorator

回答

2

你需要兩個。 {% csrf_token %}添加了POST請求中包含的隱藏字段。 @csrf_protect增加了一個由{% csrf_token %}使用的上下文變量。

+2

但文檔說:1)或者,您可以使用裝飾器csrf_protect()在您的特定視圖想要保護(見下文)。 2)與其添加CsrfViewMiddleware作爲一攬子保護,您可以在需要保護的特定視圖上使用具有完全相同功能的csrf_protect修飾器。它必須用於在輸出中插入CSRF標記的視圖以及接受POST表單數據的視圖中。 –

+1

@VitaliPonomar您總是需要表單內的{%csrf_token%}',視圖必須添加所需的上下文變量。如果上下文變量通過裝飾器,中間件或手動添加無關緊要,只需將它作爲一對。 –