web-dev-qa-db-ja.com

Django REST Framework CSRF Failed:CSRF cookie not set

Django RESTフレームワークを使用してIOS経由でAPI呼び出しを実行すると、「CSRF Failed:CSRF cookie not set。」というエラーが表示されます。

これが私のDjango APIコードです:

class LoginView(APIView):
    """
    List all snippets, or create a new snippet.
    """
    @csrf_exempt
    def get(self, request, format=None):
        startups = Startup.objects.all()
        serializer = StartupSerializer(startups, many=True)
        return Response(serializer.data)

    @csrf_exempt
    def post(self, request, format=None):
        profile = request.POST
....

私に何ができる?

22
user2237822

まだ誰かがこの質問に従っている場合、直接的な答えは、viewメソッド自体でデコレータを使用する必要があるということです。 getクラスで定義されたpostおよびAPIViewメソッドは、実際のビューの動作をDRFに通知するだけですが、ビューメソッドはDjango =ルーターが期待することは、LoginView.as_view()を呼び出すまで実際にはインスタンス化されません。

したがって、解決策はcsrf_exemptデコレータをurls.pyに追加することです。次のようになります。

#file: urls.py

from Django.conf.urls import patterns, url
from Django.views.decorators.csrf import csrf_exempt

import views

urlpatterns = patterns('',
    url('^login/$', csrf_exempt(views.LoginView.as_view())),
    ...
)

ただし、マークが上で指摘したように、セッションがハイジャックされるのを防ぐには、csrf保護が重要です。私自身はiOSを使用していませんが、Djangoの cookie-based csrf tokens の使用を検討します。 ensure_csrf_cookieデコレータを使用してDjangoにcsrftoken Cookieを応答とともに送信することができます。POSTリクエストは、そのトークンをX-CSRFTokenヘッダーとして含めます。

16

同じ問題が発生しました。私の問題は、MyAPIViewのurls.pyに.as_view()を入れるのを忘れていたことでした。したがって、次のようにする必要があります。

url(r'$', GetLikesAPI.as_view(), name='list')

ない:

url(r'$', GetLikesAPI, name='list')
5
М.Б.

ここで発生する問題は、Djangoが、メソッドas_view()またはget()ではなく、post()メソッドが返すものをすべて使用していることです。 。

したがって、次のいずれかの方法でクラスベースのビューを装飾する必要があります。

  1. Urls.py
 urlpatterns = patterns( ''、
 url( '^ login/$'、csrf_exempt(views.LoginView.as_view()))、
 ... 
)
  1. またはdispatch()メソッド(pre Django 1.9)
 from Django.utils.decorators import method_decorator 
 
 class LoginView(APIView):
 @method_decorator(csrf_exempt)
 def dispatch(self、* args、** kwargs):
 ... 
  1. またはクラスビュー自体(Django 1.9から)
 from Django.utils.decorators import method_decorator 
 
 
 @method_decorator(csrf_exempt、name = 'dispatch')
 class LoginView(APIView): 
 ... 
5
thedk

GETの場合、データを変更するべきではないため、CSRFは必要ありません。

POSTでデータを変更する場合、セッションベースの認証を使用している場合はCSRFが必要です。そうでなければ、セキュリティホールが開かれます。 Django=サーバーはiPhoneアプリにサービスを提供する予定ですが、アプリを持っている人がサーバーへのトラフィックのパケットを盗聴して、リバースエンジニアリングアクセスを阻止することはできます。他の種類のWebクライアントを備えたサーバー。このため、Django Rest Frameworkは場合によってはCSRFを必要とします。これは Django Rest Frameworkのドキュメント に記載されています。

POSTのこの要件を回避する方法は、セッション認証を使用しないことです。たとえば、HTTPS経由でBasicAuthenticationを使用できます。この認証メカニズムでは、HTTPSを使用して、資格情報がすべての要求でクリアテキストで渡されないようにする必要があります。

3
Mark Chackerian
urlpatterns = patterns('',
       url('^login/$', csrf_exempt(views.LoginView.as_view())),
       ...
)

みんな。同じエラーが発生し、それを見つけるためだけに多くの時間を費やしました。つまり、ルーティングで何かを忘れてこのエラーが発生することがあります。

2
Df.fpm

私の場合は、最後にスラッシュなしでurl = ' http://example.com/list/5 'にput要求を送信したために発生しました。 urlをurl = ' http://example.com/list/5/ 'に変更すると、すべてが機能し始めました。

2
Radren

これは古い質問ですが、最近遭遇した問題です。

DRFは、セッション認証を使用しない限り、デフォルトでCSRFを無効にします。デフォルトでは、NSURLconnectionはCookieを処理するように設定されています。 Cookieを使用しないようにiOSアプリに明示的に指示する必要があります。その後、必要に応じてセッション認証を引き続き使用でき、csrfでビューを除外する必要はありません。

1
kevswanberg