簡體   English   中英

DRF 中的 request.data 與 Django 中的 request.body

[英]request.data in DRF vs request.body in Django

Django REST framework 引入了一個 Request 對象,它擴展了常規的 HttpRequest,這個新的對象類型有request.data來訪問 'POST'、'PUT' 和 'PATCH' 請求的 JSON 數據。

但是,我可以通過訪問 request.body 參數來獲取相同的數據,該參數是原始 Django HttpRequest 類型對象的一部分。

我看到的一個區別是 request.data 只能訪問一次。 此限制不適用於 request.body。

我的問題是兩者之間有什么區別。 There should be one-- and preferably only one --obvious way to do it.來做同樣的事情時,什么是首選的,DRF 提供了一種替代方法來做同樣的事情的原因There should be one-- and preferably only one --obvious way to do it.

更新:限制正文始終為 JSON 類型的用例。 從不使用 XML/圖像或傳統的表單數據。 每個的優點/缺點是什么?

您應該使用request.data 它更靈活,涵蓋更多用例,並且可以根據需要多次訪問。 引用文檔:

關於request.data

REST framework 引入了一個 Request 對象,它擴展了常規的 HttpRequest,並提供了更靈活的請求解析。 Request 對象的核心功能是 request.data 屬性,它類似於 request.POST,但對於使用 Web API 更有用。

request.POST # 只處理表單數據。 僅適用於“POST”方法。

request.data # 處理任意數據。 適用於“POST”、“PUT”和“PATCH”方法。

關於request.body

作為字節字符串的原始 HTTP 請求正文。 這對於以不同於傳統 HTML 表單的方式處理數據非常有用:二進制圖像、XML 負載等。對於處理傳統表單數據,請使用 HttpRequest.POST。

因此,除非您想處理二進制圖像或 XML 負載,否則永遠不要使用request.body ,它只是一個包含請求正文的簡單字符串。 始終使用request.data將是完全解析的主體(即 Python dict ),它更便於處理。

rest_framework.request.Request

  • request.body是字節,它總是可用的,因此沒有使用限制
  • request.data是一個“屬性”方法,可以引發異常,但它為您提供解析數據,這更方便

然而,世界並不完美,這是request.body獲勝的案例

考慮這個例子:

如果客戶端發送: content-type: text/plain

並且您的 REST 端點不接受text/plain

如果您訪問request.data您的服務器將返回415 Unsupported Media Type

但是如果你知道json.loads(request.body)是正確的 json 呢? 所以你想使用它,只有request.body允許。

僅供參考:所描述的示例是 AWS 發送到 HTTP 端點的 AWS SNS 通知消息。 AWS SNS 在這里充當客戶端,當然,這個案例是他們 SNS 中的一個錯誤。


request.body好處的另一個示例是您擁有自己的自定義解析並使用自己的 MIME 格式的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM