2017-03-03 83 views
0

我正在使用Django Rest的可瀏覽API使用會話身份驗證進行POST,並且即使提供了CSRF令牌也沒有。我正在尋求關於配置我的ModelViewSet子類的建議,以便它可以工作。Django DRF CSRF令牌丟失 - DRF刪除了request.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 

我能夠使用DRF可瀏覽API來GET這個端點,但是當我用它來POST這個終點,我得到一個403的消息CSRF token missing or incorrect

當我在the constructor to rest_framework.request.Request設置斷點,我可以看到,在傳遞的請求包含所需csrfmiddleware令牌:

enter image description here

在Django中休息的Request類,POST實際上是一個屬性:

@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鍵;它被剝離與形式提供的所有鍵:

empty QueryDict

結果,傳遞給rest_framework.authentication.SessionAuthentication.enforce_csrf(request)參數,然後傳遞給django.middleware.csrf.CsrfViewMiddleware.process_view沒有找到csrfmiddlewaretoken令牌:

 if request.method == "POST": 
      request_csrf_token = request.POST.get('csrfmiddlewaretoken', '') 

什麼我可以檢查嗎?這裏有什麼可能的錯誤來源?

考慮

  • 在禁用CSRF
  • 沒有興趣使用令牌認證
  • 很熟悉如何使用CSRF令牌和Django文檔他們不感興趣
  • 很熟悉w ^第i個Django REST's docs on CSRF tokens
  • 這是內置Django的REST API可瀏覽;在UI

EDIT 1沒有修改任何東西 - 中間件

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。8

編輯3 - 在Git項目可能相關問題

編輯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 cookie是正確發送的。無論如何,請看看2017-03-06編輯。 –

+0

你是否可以用郵遞員或捲髮來做請求?您是否以任何方式定製了視圖集?另外,你爲什麼使用全部三個解析器? –

回答