2017-03-03 10 views
0

私は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を取得します。

enter image description here

ジャンゴ残りの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', '') 

何:

empty QueryDict

その結果、その後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プロジェクトにおそらく関連する問題

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

+0

これは奇妙です。あなたのミドルウェア設定は何ですか?たぶん何かが欠けているかもしれません。 – Linovia

+0

@Linovia、CSRFのクッキーが正しく送信されたことを確認したので、そうは思わないでしょう。しかし、とにかく、2017-03-06の編集を見てください。 –

+0

郵便配達員やカールでリクエストできますか?どのようにしてビューセットをカスタマイズしましたか?また、なぜ3つのパーサーをすべて使用していますか? –

答えて

関連する問題