2015-06-05 25 views
9

Ben DRF bir görünüm için aşağıdaki kod:Django istirahat Çerçevesi: Boş request.data

import requests 
payload = {"foo":"bar"} 
headers = {'Content-type': 'application/json'} 
r = requests.put("https://.../myPk", data= payload, headers=headers) 
: Ben şu şekilde piton-istekleri aracılığıyla URL'yi diyoruz

from rest_framework import viewsets 

class MyViewSet(viewsets.ViewSet): 

    def update(self, request, pk = None): 
     print pk 
     print request.data 

ancak istek sunucudan alındığında request.data boş. İşte çıktı:

myPk 
<QueryDict: {}> 

Bu sorunu nasıl giderebilirim?

+0

requests.post – Mikeec3

+0

Mikeec3 dinlenme framwork ait doc kullanmayı deneyin yardımcı olur Umut (çünkü bunların Sorunu bakıyordu benim url ters eğik çizgi izleyen eksikti) diyor: _request.data, istek gövdesinin ayrıştırılmış içeriğini döndürür. Bu, standart request.POST ve request.FILES özniteliklerine benzerdir: - Dosya ve dosya dışı girdiler dahil tüm ayrıştırılmış içeriği içerir. ** - POST dışındaki HTTP yöntemlerinin içeriğinin ayrıştırılmasını destekler, bu da PUT ve PATCH isteklerinin içeriğine erişebilmenizi sağlar. ** - Yalnızca form verilerini desteklemekten ziyade REST çerçevesinin esnek istek ayrıştırmasını destekler. Örneğin gelen JSON verilerini, gelen form data._ işlemiyle aynı şekilde ele alabilirsiniz. – floatingpurr

cevap

11

payload seri hale getirilmiş json nesnesi olarak göndermeniz gerekir. Sen (pdb veya ipdb ile örneğin) görünümü ayıklama veya böyle değişkeni yazdırarak bu hata mesajı yerine

*** ParseError: JSON parse error - No JSON object could be decoded 

:

import json 
import requests 
payload = {"foo":"bar"} 
headers = {'Content-type': 'application/json'} 
r = requests.put("https://.../myPk/", data=json.dumps(payload), headers=headers) 

Aksi ne olur hakkında DRF aslında şikayet edecektir

def update(self, request, pk = None): 
    print pk 
    print str(request.data) 
+0

Sözlüğü bir json olarak serileştirmeyi denedim ancak hala çalışmıyor. Var değerlerinin baskısını okuduğumda her zaman 'myPk' ve' 'olsun. – floatingpurr

+0

Yazdırma isteği.data işlevi yerine print request.stream.read() işlevini yazdırdığınızda ne tür bir çıktı alırsınız (bu test için 'print request.data' kaldırmak gerekir). Bu, isteğinizden değiştirilmemiş ham verileri size göstermelidir. Orada bir şey görüyor musun? [.stream in docs] (http://www.django-rest-framework.org/api-guide/requests/#stream) – sthzg

+0

"print request.stream" satırını ekledim.def güncellemesinden hemen sonra read() '(self, request, pk = None):'. Çıktı: 'AttributeError: 'NoneType' nesnesinin 'read' özelliği yoktur – floatingpurr

1

, isteklerin yeni yeterince sürümdeyseniz varsayarsak yapmanız gereken:

import requests 

payload = {"foo":"bar"} 
r = requests.put("https://.../myPk", json=payload, headers=headers) 

Daha sonra, yükü sizin için uygun biçimde biçimlendirecek ve uygun üstbilgileri sağlayacaktır. Aksi halde, JSF gönderdiğinizi belirttiğiniz için DRF'nin doğru ayrıştırmayacağı application/x-www-urlformencoded verilerini gönderiyorsunuz.

+0

Tamam, ancak üstbilgi = {'İçerik türü': 'application/json'} 'içindeki biçimi belirtiyorum – floatingpurr

2

Kontrol 2 burada sorunları: -

  1. Json biçimi doğru olup olmadığını.
  2. URL doğru olup olmadığını

o

İlgili konular