2015-11-16 60 views
0

我使用郵遞員這樣做的請求到我的本地服務器:DRF - 訪問請求的POST數據

POSTMan post request

正如你可以看到它是一個post請求。在我看來(APIView)我需要訪問json數據。但是,當我嘗試:

request.POST 
# <QueryDict: {}>  

request.data # ¿? 
# AttributeError: 'WSGIRequest' object has no attribute 'data' 

的唯一途徑,我可以看到發送的數據是,當我訪問

request.body 
# '{\n "token": "6J3qG4Ji2Jw44eIklKvPYxUgclfGRWHZDKG",\n "city": "Port Orange",\n "state": "FL",\n "formatted_address": "Peach Blossom Blvd 5329",\n "_zip": "32128"\n}' 

但這是一個'str'

>>> type(request.body) 
<type 'str'> 

我試圖符合請求dispatch()方法中的請求數據。我可以這樣做:

req = self.initialize_request(request) 

這會返回一個rest_framework.request.Request對象,我可以訪問請求數據。但我不能叫

super(FaveoAPIView, self).dispatch(request, *args, **kwargs) 

因爲我得到:

{ 
    "status_code": 400, 
    "object": "Malformed request.", 
    "success": false 
} 

我can'r明白爲什麼,我想,當我打電話self.initialize_request()什麼變化。任何想法?

+0

你在這裏試圖解決的實際問題是什麼?在大多數情況下,重寫dispatch()方法實際上並不是解決問題的最佳方法。 –

+0

@JoeyWilhelm我不想重寫dispatch,我想在普通視圖流程之前執行一些代碼。但是在我的post(或get)方法執行之前,我需要訪問request.data。 – Gocht

回答

1

我相信你應該能夠覆蓋你的視圖的initial()方法,以實現你想要的。從APIView類的文檔字符串讀取:

""" 
Runs anything that needs to occur prior to calling the method handler. 
""" 

所以,它看起來是這樣的:

class FaveoAPIView(APIView): 

    def initial(self, request, *args, **kwargs): 
     super(FaveoAPIView, self).initial(request, *args, **kwargs) 
     # Manipulate request.data to your heart's content here 

APIView,這是您的立即處理方法之前調用。

+0

Wihelm我可以看到這是在調度過程中以及post或get之前執行的,但是此方法不會返回任何內容,所以如果我的驗證在此處失敗,則無法返回帶有錯誤消息的Response。或者可能嗎? – Gocht

0

super(FaveoAPIView, self).dispatch(request, *args, **kwargs)將調用initialize_request將請求轉換爲DRF。這隻能是一次,因此它會在那之後失敗。

而不是修復一個破損的解決方案,您是否更願意告訴我們您的實際問題,即爲什麼您需要在視圖本身被調用之前訪問請求數據?

+0

還有另外一種方法可以做到這一點,但是我正在檢查POST數據中的一些值,檢查它的數據類型,或者它們是否是允許的值,例如,我需要一個整數,但是lt 100和gt 5。我想將這些方法應用於我的所有觀點。如果請求的數據沒有通過條件,我不會執行POST或GET方法。 – Gocht

+0

這是串行器的用途。 – Linovia

+0

我將不得不在每個序列化器中編寫方法,因爲序列化器可以在post或get方法中執行。如果條件失敗,我想避免執行post或get方法。 – Gocht