有兩種方式來保護CSRF你的Django網站:
1 - 使用中間件,最簡單的方法:
django.middleware.csrf.CsrfViewMiddleware
會自動爲上下文添加一個CSRF令牌。
此中間件在您的settings.py
文件中默認啓用,您可以在模板中直接使用此令牌。
使用此解決方案,您無需執行任何操作,只需在模板中使用{%csrf_token%}標記即可。
2 - 使用csrf_protect
裝飾:
如果禁用了中間件(不推薦),你仍然可以使用csrf_protect
裝飾(似乎這是你想要的解決方案,而不是與它正如Danielle指出的那樣正確導入)。
但是,你的問題似乎是,你不應該像你應該使用它。
這是一個修飾符,即一個函數,它返回作爲參數傳遞的函數的修改版本。在這裏你傳遞一個請求對象。
使用Python,canuse一個裝飾這樣:
@decorator
def function([...]):
[...]
所以你的觀點應該是這樣的:使用{% csrf_token %}
標籤
@csrf_token
def your_view(request, *args, **kwargs):
# Your view code
:
使用這些解決方案之一後,您可以直接在模板中使用{% csrf_token %}
標籤,因爲csrf標記應該位於模板呈現的上下文中(感謝middl eware或csrf_protect
裝飾):
<form>
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
這裏有更多關於CSRF保護和Django:
https://docs.djangoproject.com/en/1.10/ref/csrf/
這裏更多的是裝飾用的Python:
https://wiki.python.org/moin/PythonDecorators
不幸的是,這給了我相同的錯誤 –
我認爲你不正確地使用裝飾 - 檢查這裏的文檔爲例:https://docs.djangoproject.com/en/1.10/ref/csrf/#module- django.views.decorators.csrf –