見出し画像

DjangoでPOSTを使用するには~CSRF対策を無効にする方法~

症状


djangoでPOSTでリクエストした時に403エラーが発生しました。

原因


djangoではデフォルトでGET以外のメソッドが無効になっているようです。
どうやらCSRF(クロスサイトリクエストフォージェリ)対策みたいです。

settings.pyのMIDDLEWARE_CLASSESでデフォルトで'django.contrib.csrf.middleware.CsrfMiddleware'が設定されています。
これでCSRF対策が有効になっています。

対処法

views.pyのCSRF対策を無効にしたい関数に@csrf_exemptデコレータを設定することでCSRF対策を無効にすることができます。

ちなみにPOSTでリクエストする場合はchrome拡張機能やPOSTでリクエストを送信できるサイトがあるみたいなのでそちらでテストをしました。
テスト用ツール
https://so-zou.jp/web-app/network/post/
Chrome拡張機能
https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
   return HttpResponse('Hello world')

補足

settings.pyの'django.contrib.csrf.middleware.CsrfMiddleware'を削除することですべてのCSRF対策を無効にすることができます。
その後CSRF対策を有効にしたい関数にだけ@csrf_protectを設定するとCSRF対策が有効になります。
この方法はデコレータを設定し忘れるとCSRF対策が無効なままなのでセキュリティ面で良くないので非推奨になっています。

from django.shortcuts import render
from django.views.decorators.csrf import csrf_protect

@csrf_protect
def my_view(request):
   c = {}
   # ...
   return render(request, "a_template.html", c)
   

参考資料
https://docs.djangoproject.com/en/3.1/ref/csrf/

この記事が気に入ったらサポートをしてみませんか?