私はDjango Restのブラウズ可能なAPIを使用してPOSTにセッション認証を使用していますが、CSRFトークンが提供されていてもそれが失われています。私は私のModelViewSet
サブクラスの設定についてアドバイスを求めています。ここでDjango DRF CSRFトークンがありません - DRFがリクエストを削除しました.POSTデータ?
は私のビューセットです:
class TreeAPI(ModelViewSet):
authentication_classes = (SessionAuthentication,)
queryset = Tree.objects.get_roots()
parser_classes = (JSONParser, FormParser, MultiPartParser)
permission_classes = (IsAdminUser,)
throttle_classes = (TreeThrottle,)
serializer_class = TreeSerializer
私はGET
にこのエンドポイントをDRFブラウズ可能なAPIを使用することですが、私は、このエンドポイントにPOST
にそれを使用するとき、私はメッセージCSRF token missing or incorrect
で403を取得します。
ジャンゴ残りのRequest
クラスでPOST
は実際にはプロパティです、私はthe constructor to rest_framework.request.Requestにブレークポイントを設定すると、渡されたリクエストが必要csrfmiddleware
トークンが含まれていることを
、私が見ることができます
@property
def POST(self):
if not _hasattr(self, '_data'):
self._load_data_and_files()
if is_form_media_type(self.content_type):
# self.data is an empty QueryDict!
return self.data
return QueryDict('', encoding=self._request._encoding)
request.POST
には、csrfmiddlewaretoken
キーが含まれなくなりました。それは、フォームに付属のすべてのキーを剥奪されています
if request.method == "POST":
request_csrf_token = request.POST.get('csrfmiddlewaretoken', '')
何:
その結果、その後django.middleware.csrf.CsrfViewMiddleware.process_view
に渡されrest_framework.authentication.SessionAuthentication.enforce_csrf(request)
に渡されたパラメータはcsrfmiddlewaretoken
トークンを見つけることができません。確認できますか?考えられる原因は何ですか?
考慮事項
- ないCSRF
- ないトークン認証にそれらにCSRFトークンとDjangoのドキュメントを使用する方法に精通
- 午前の使用に興味を無効に興味
- おなじみのw iith Django REST's docs on CSRF tokens
- これは組み込みのDjango RESTブラウズ可能APIです。ミドルウェア
MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', )
EDIT 2 - - ソフトウェア のバージョン - djangorestframeworkの== 3.3.3 - Djangoの== 1.9 EDIT 1は
UIでを何も変更していません。8
EDIT 3 - Gitプロジェクトにおそらく関連する問題
- 'request.data' empty when multipart form data POST in 3.3.x 3814
- Request.data empty when multipart/form-data POSTed 3951
EDIT 4 - おそらく関連スタックオーバーフローポスト
- Having a POST'able API and Django's CSRF Middleware
- How to make a POST simple JSON using Django REST Framework? CSRF token missing or incorrect
- How to make a Django-Rest-Framework API that takes POST data?
- Django Rest Framework, ajax POST works but PATCH throws CSRF Failed: CSRF token missing or incorrect
- http://www.django-rest-framework.org/api-guide/parsers/#formparser
これは奇妙です。あなたのミドルウェア設定は何ですか?たぶん何かが欠けているかもしれません。 – Linovia
@Linovia、CSRFのクッキーが正しく送信されたことを確認したので、そうは思わないでしょう。しかし、とにかく、2017-03-06の編集を見てください。 –
郵便配達員やカールでリクエストできますか?どのようにしてビューセットをカスタマイズしましたか?また、なぜ3つのパーサーをすべて使用していますか? –