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
....
私に何ができる?
まだ誰かがこの質問に従っている場合、直接的な答えは、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
ヘッダーとして含めます。
同じ問題が発生しました。私の問題は、MyAPIView
のurls.pyに.as_view()
を入れるのを忘れていたことでした。したがって、次のようにする必要があります。
url(r'$', GetLikesAPI.as_view(), name='list')
ない:
url(r'$', GetLikesAPI, name='list')
ここで発生する問題は、Djangoが、メソッドas_view()
またはget()
ではなく、post()
メソッドが返すものをすべて使用していることです。 。
したがって、次のいずれかの方法でクラスベースのビューを装飾する必要があります。
urlpatterns = patterns( ''、 url( '^ login/$'、csrf_exempt(views.LoginView.as_view()))、 ... )
dispatch()
メソッド(pre Django 1.9)from Django.utils.decorators import method_decorator class LoginView(APIView): @method_decorator(csrf_exempt) def dispatch(self、* args、** kwargs): ...
from Django.utils.decorators import method_decorator @method_decorator(csrf_exempt、name = 'dispatch') class LoginView(APIView): ...
GETの場合、データを変更するべきではないため、CSRFは必要ありません。
POSTでデータを変更する場合、セッションベースの認証を使用している場合はCSRFが必要です。そうでなければ、セキュリティホールが開かれます。 Django=サーバーはiPhoneアプリにサービスを提供する予定ですが、アプリを持っている人がサーバーへのトラフィックのパケットを盗聴して、リバースエンジニアリングアクセスを阻止することはできます。他の種類のWebクライアントを備えたサーバー。このため、Django Rest Frameworkは場合によってはCSRFを必要とします。これは Django Rest Frameworkのドキュメント に記載されています。
POSTのこの要件を回避する方法は、セッション認証を使用しないことです。たとえば、HTTPS経由でBasicAuthenticationを使用できます。この認証メカニズムでは、HTTPSを使用して、資格情報がすべての要求でクリアテキストで渡されないようにする必要があります。
urlpatterns = patterns('',
url('^login/$', csrf_exempt(views.LoginView.as_view())),
...
)
みんな。同じエラーが発生し、それを見つけるためだけに多くの時間を費やしました。つまり、ルーティングで何かを忘れてこのエラーが発生することがあります。
私の場合は、最後にスラッシュなしでurl = ' http://example.com/list/5 'にput要求を送信したために発生しました。 urlをurl = ' http://example.com/list/5/ 'に変更すると、すべてが機能し始めました。
これは古い質問ですが、最近遭遇した問題です。
DRFは、セッション認証を使用しない限り、デフォルトでCSRFを無効にします。デフォルトでは、NSURLconnectionはCookieを処理するように設定されています。 Cookieを使用しないようにiOSアプリに明示的に指示する必要があります。その後、必要に応じてセッション認証を引き続き使用でき、csrfでビューを除外する必要はありません。