[解決済み] DjangoのRest Frameworkはcsrfを削除します。
質問
Django Rest Frameworkに関する回答があることは知っていますが、私の問題に対する解決策は見つかりませんでした。
私は、認証といくつかの機能を持つアプリケーションを持っています。 私はそれに新しいアプリを追加し、それはDjango Rest Frameworkを使用します。私はこのアプリの中でだけライブラリを使用したい。また、私はPOSTリクエストを行いたいのですが、私はいつもこの応答を受け取ります。
{
"detail": "CSRF Failed: CSRF token missing or incorrect."
}
次のようなコードがあります。
# urls.py
from django.conf.urls import patterns, url
urlpatterns = patterns(
'api.views',
url(r'^object/$', views.Object.as_view()),
)
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.views.decorators.csrf import csrf_exempt
class Object(APIView):
@csrf_exempt
def post(self, request, format=None):
return Response({'received data': request.data})
現在のアプリケーションに影響を与えることなく、APIを追加したい。 そこで質問なのですが、このアプリだけCSRFを無効にするにはどうすればいいのでしょうか?
解決方法を教えてください。
なぜこのエラーが発生するのですか?
この現象は、デフォルトの
SessionAuthentication
DRFが使用するスキーム。DRFの
SessionAuthentication
は、CSRF をチェックする必要がある認証に Django のセッションフレームワークを使用します。
を定義しない場合
authentication_classes
は、この認証クラスをデフォルトとして使用します。
'DEFAULT_AUTHENTICATION_CLASSES'= (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication'
),
DRFは、同じビューに対してセッションベースと非セッションベースの両方の認証をサポートする必要があるため、認証されたユーザーのみに対してCSRFチェックを実施します。つまり、認証されたリクエストだけが CSRF トークンを必要とし、匿名のリクエストは CSRF トークンなしで送信される可能性があります。
AJAXスタイルのAPIをSessionAuthenticationで使用している場合、以下のようなHTTPメソッド呼び出しに有効なCSRFトークンを含める必要があります。
PUT, PATCH, POST or DELETE
リクエストに対応します。
では、どうすればいいのでしょうか?
csrfチェックを無効にするには、カスタム認証クラスを作成します。
CsrfExemptSessionAuthentication
を継承したもので、デフォルトの
SessionAuthentication
クラスがあります。この認証クラスでは
enforce_csrf()
の内部で行われていたチェックを、実際の
SessionAuthentication
.
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
class CsrfExemptSessionAuthentication(SessionAuthentication):
def enforce_csrf(self, request):
return # To not perform the csrf check previously happening
ビューの中で
authentication_classes
とする。
authentication_classes = (CsrfExemptSessionAuthentication, BasicAuthentication)
これでcsrfのエラーに対処できるはずです。
関連
-
Djangoは、フォームを送信するときに403エラーに遭遇しました。CSRF 検証に失敗しました。
-
ImproperlyConfiguredです。DEFAULT_INDEX_TABLESPACE の設定を要求されましたが、設定されていません。
-
[解決済み] Django テンプレート内で現在の URL を取得する方法は?
-
[解決済み] Django-Rest-Framework のシリアライザーで Request.User を取得する方法とは?
-
[解決済み] Djangoテンプレート内でコレクションのサイズを確認するにはどうすればよいですか?
-
[解決済み] Django REST フレームワーク: 非モデルシリアライザー
-
[解決済み] Django ManyToMany filter()
-
[解決済み] Djangoのデータベースクエリ。id でオブジェクトを取得するには?
-
[解決済み] django-tastypie と djangorestframework の違いは何ですか?[クローズド]
-
[解決済み] list_display - メソッド用のブール型アイコンです。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Django。"makemigrations "時に変更が検出されない。
-
Django QuerySet マルチテーブル結合/条件付きピッキング/マージ
-
[解決済み] django の OneToOneField と ForeignKey の違いは何ですか?
-
[解決済み] FastCGIとDjangoを使用しているnginxのエラーログはどこで見ることができますか?
-
[解決済み] シグナルハンドラは django プロジェクトのどこにあるべきですか?
-
[解決済み] DjangoのRest Frameworkはcsrfを削除します。
-
[解決済み] Django が ManyToMany リレーションシップからオブジェクトを取り除く
-
[解決済み] RESTful API のトークン認証:トークンは定期的に変更する必要がありますか?
-
[解決済み] Djangoテンプレートでネストされたforループで一番外側のforloop.counterにアクセスする方法は?
-
[解決済み] Django はフォームが初期化された後にフィールドの値を設定します。