簡體   English   中英

使用Django在沒有表單(REST api)的情況下訪問POST字段數據

[英]Acessing POST field data without a form (REST api) using Django

django文檔中 ,它說:

HttpRequest.POST

類似字典的對象,包含所有給定的HTTP POST參數,前提是請求包含表單數據。 請參閱下面的QueryDict文檔。 如果您需要訪問請求中發布的原始或非表單數據,請通過HttpRequest.body屬性訪問它。

但是,服務器不響應瀏覽器(例如使用JS框架或表單),而是響應Anroid / iOS應用程序發送的REST API。

如果客戶端直接在POST請求中發送字段,我該如何讀取數據? 例如,這個(Java + Unirest):

Unirest.post("/path/to/server")
       .field("field1", "value2")
       .field("field2", "value2");

編輯:我可以使用response.POST["field1"]簡單地讀取數據,還是我必須對request.body做一些事情?

編輯2:所以我可以簡單地使用request.body作為類似於字典的對象,類似於request.POST

據我所知,Unirest的字段方法只使用普通的application/x-www-form-urlencoded數據,如HTML表單。 所以你應該能夠像你建議的那樣使用response.POST["field1"]

來自文檔

request.data返回請求正文的已解析內容。 這類似於標准的request.POSTrequest.FILES屬性,除了:

  • 它包括所有已解析的內容,包括文件和非文件輸入。
  • 它支持解析除POST之外的HTTP方法的內容,這意味着您可以訪問PUTPATCH的內容
    要求。
  • 它支持REST框架的靈活請求解析,而不僅僅支持表單數據。 例如,您可以像處理傳入表單數據一樣處理傳入的JSON數據。

我可以使用response.POST["field1"]簡單地讀取數據,還是我必須對request.body做一些事情?

所以我可以簡單地使用request.body作為類似於字典的對象,類似於request.POST

示例 - 來自create方法(viewsets):

user = dict(
                full_name=request.DATA['full_name'],
                password=request.DATA['password'],
                email=request.DATA['email'],
                personal_number=request.DATA['personal_number'],
                user_type=request.DATA['user_type'],
                profile_id=request.DATA['profile_id'],
                account_id=request.DATA['account_id']
            )

編輯1在版本3(最新)中 - request.DATA已替換為request.data

user = dict(
                    full_name=request.data['full_name'],
                    password=request.data['password'],
                    email=request.data['email'],
                    personal_number=request.data['personal_number'],
                    user_type=request.data['user_type'],
                    profile_id=request.data['profile_id'],
                    account_id=request.data['account_id']
                )

如果您正在與之交互的api是一個基於Django類的sipmle視圖,則可以通過request.body訪問數據,如下所示:

class MyView(View):
    def post(self, request):
        field1 = request.body.get('field1')
        field2 = request.body.get('field2')
        ... # processing here

如果您使用的是Django rest framework api,則可以通過request.data訪問數據:

field1 = request.data.get('field1')
field2 = request.data.get('field2')

注意:如果你發現在互聯網上某處使用的request.DATA也是正確的,但它只適用於舊版本的DRF,並且在新版本中不推薦使用request.data

暫無
暫無

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

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