csrf_token

クロスサイトリクエストフォージェリ(CSRF) を防ぐためのモノです。

とはいえ、実はこの設定でつまづいた。

他のサイト、日本語資料を参考に設定を試みた。

 

で、結論(?確定ではないが、おそらくこれ)

htmlにおいて、form等を使用する際は

{% csrf_token %}

が必要になる。ただし、htmlにcookie要素が無い場合は、受け取り側(views.py等)にて@csrf_protectを設定するとエラーになる。よって、htmlにだけ{% csrf_token %}を設定する事象も起きるということ。

 

通常設定を下記の通り。htmlの作り込みによって、幾分変更が必要となる。

 

初期設定としてsettings.py にて CsrfViewMiddleware が設定される。

MIDDLEWARE_CLASSES = (
  'django.middleware.csrf.CsrfViewMiddleware',
)

 

使用例:views.py

from django.views.decorators.csrf import csrf_protect
@csrf_protect
def xxxx ():
....
使用例:html
<form ....>
  {% csrf_token %}
  <input type="text" name="test" />
  <input type="submit" value="検索" />
/form>
追記:
外部サイトからのPOSTを受けつける場面などでCSRF検証を免除しないとリクエストを正しく受け取れないことなどが考えられる。
その場合、setting.pyの'django.middleware.csrf.CsrfViewMiddleware'は残しておき、以下のようにCSRF検証を無効化したい関数に@csrf_exemptとする。
使用例:views.py
from django.views.decorators.csrf import csrf_exempt 
@csrf_exempt 
def my_view(request):
.......