質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Q&A

解決済

1回答

1061閲覧

RedirectViewを使用するとCSRF検証に失敗する

sasaki0628

総合スコア106

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

0グッド

0クリップ

投稿2022/12/28 04:43

トップページ以外にアクセスをしたときにトップページに遷移するようにしたく、Redirectviewを使用しました。

urls.py

from django.urls import path, re_path from django.views.generic import TemplateView, RedirectView urlpatterns = [ path("", TemplateView.as_view(template_name='index.html')), re_path("", RedirectView.as_view(url='/')), ]

RedirectViewによりトップページに遷移したあと、APIでPOST送信を行うとCSRF検証のエラーが出力されます。

アクセス禁止 (403) CSRF検証に失敗したため、リクエストは中断されました。 Help Reason given for failure: CSRF token missing. In general, this can occur when there is a genuine Cross Site Request Forgery, or when Django’s CSRF mechanism has not been used correctly. For POST forms, you need to ensure: Your browser is accepting cookies. The view function passes a request to the template’s render method. In the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL. If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data. The form has a valid CSRF token. After logging in in another browser tab or hitting the back button after a login, you may need to reload the page with the form, because the token is rotated after a login. You’re seeing the help section of this page because you have DEBUG = True in your Django settings file. Change that to False, and only the initial error message will be displayed. You can customize this page using the CSRF_FAILURE_VIEW setting.

re_path("", RedirectView.as_view(url='/')), をコメントアウトすると、CSRF検証エラーは出力されません。トップページではwebpackで作成したフロントエンドのJSファイルを表示するhtmlを表示しています。

index.html

<!DOCTYPE html> {% load static %} <html lang="en"> <head> <meta charset="utf-8"> <title>テストページ</title> </head> <body> <div id="root"></div> <script src="/static/js/bundle.js" ></script> </body> </html>

CSRF検証エラーを回避するには、どうすればよいでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

re_path("", RedirectView.as_view(url='/')), は、urlpatterns内の最終行に書く必要があることが分かりました。実際は中途半端な位置に書いていたため、バグが生じていました。

投稿2022/12/28 16:19

sasaki0628

総合スコア106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問