1. ホーム
  2. パイソン

"CSRFトークンがないか不正確です "の解決策。

2022-03-02 20:58:38

現象

禁制 (403)
CSRF 検証に失敗しました。
ヘルプ
失敗の理由を教えてください。
CSRFトークンがないか、不正確です。
一般に、これは本物の Cross Site Request Forgery がある場合や、 Django の CSRF 機構が正しく使われていない場合に発生します。 POST フォームでは、以下のことを確認する必要があります。
ブラウザがCookieを受け入れている。
ビュー関数では、テンプレートにContextではなくRequestContextを使用しています。
テンプレートでは、各POSTフォームの内部に内部URLを対象とした{% csrf_token %}テンプレートタグが存在します。
CsrfViewMiddleware を使用していない場合は、csrf_token テンプレートタグを使用するビュー、および POST データを受け付けるビューで csrf_protect を使用する必要があります。
このページのヘルプセクションが表示されているのは、Django の設定ファイルで DEBUG = True になっているからです。 のメッセージが表示されます。
CSRF_FAILURE_VIEWの設定を使って、このページをカスタマイズすることができます。

解決の手順

1〉djangoプロジェクト settings.py

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware,
    'django.middleware.csrf.CsrfViewMiddleware',# confirm the existence of
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware,
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)





2〉htmlでフォームに追加されたテンプレートタグ {%% csrf_token %} です。

<form action=". " method="post">{% csrf_token %}





3〉djangoプロジェクト views.py

from django.shortcuts import render_to_response
from django.template import RequestContext

def some_view(request):
    # ...
    return render_to_response('my_template.html',
                              my_data_dictionary,
                              context_instance=RequestContext(request))

ご質問はこちらへ クロスサイトリクエストフォージェリ対策

P.S ブロックしたい場合 CSRF

方法1:djangoプロジェクトのsettings.pyをコメントアウトする

#'django.middleware.csrf.CsrfViewMiddleware'








方法2. django project views.py でマスキングデコレーターを追加します。

from django.views.decorators.csrf import csrf_exempt 
@csrf_exempt
def some_view(request):
    #...