2013-07-24 7 views
5

Aşağıdaki görünüme sahip:Django istirahat Çerçeve ham JSON olarak geçirilen veri serisini gelmez

class Authenticate(generics.CreateAPIView): 
    serializer_class = AuthSerializer 

    def create(self, request): 
     serializer = AuthSerializer(request.POST) 
     # Do work here 

veri ham JSON olarak geçirildiği takdirde veri Ancak biçimi olarak geçirilir, bu iyi çalışıyor serializer, None (Hiçbiri) olarak ayarlanmış tüm alanları ile eşleştirilir. Belgeler, ham bir JSON argümanını işlemek için belirli bir şey olması gerektiğini belirtmektedir.

Herhangi bir yardım için teşekkür ederiz.

GÜNCELLEME

ham JSON geçerken beklenen ama daha iyi bir yolu olmalı inandığı gibi ben Gözatılabilir API çalışması için etrafında aşağıdaki iş var.

def parse_data(request): 
    # If this key exists, it means that a raw JSON was passed via the Browsable API 
    if '_content' in request.POST: 
     stream = StringIO(request.POST['_content']) 
     return JSONParser().parse(stream) 
    return request.POST 


class Authenticate(generics.CreateAPIView): 
    serializer_class = AuthSerializer 

    def create(self, request): 
     serializer = AuthSerializer(parse_data(request)) 
     # Do work here 
+0

Elinizde ne var? Yoksa hiç hata yaptın mı? –

+0

Diziselleştirici, Nones ile başlatıldı. Sorun, Browsable API'nin JSON'u bir '_content' anahtarının içine göndermesidir. Bunun ne zaman olduğunu ve json'u bir tahdille ayrıştırmak için bir fonksiyon yarattım ama daha iyi bir yol olması gerektiğine inanıyorum. – Raphael

cevap

8

İstek verilerinize yanlış şekilde erişiyorsunuz - request.POST yalnızca ayrıştırma formunu çok parçalı verilerle işler.

Bunun yerine REST framework'ün request.data kullanın. Bu, form verilerini veya json verilerini veya yapılandırdığınız diğer ayrıştırıcıları ele alır.

+0

Çerçevenin kendisinin yaratıcısından bir cevap gibi bir şey yok :) – Raphael

1

Bu durumda, Browsable API'yi kullandığınız zamanın yolu budur.

Ben bunun yerine curl JSON isteği sınamak kullanmak Gözatılabilir API kullanmak gerektiğini düşünüyorum:

curl -v -H "Content-type: application/json" -X POST -d '{"foo": 1, "bar": 1}' http://127.0.0.1:8000/api/something/ 

yardımcı olur Umut.

+0

Diğer geliştiriciler, JSON'larını doğrulamak için Browsable API'yi kullanmayı ve Browsable API'nin serileştirici JSON'u yayınlamak için bir sekmesi olmasını beklediğinden, serializer'ın bununla çalışmasını sağlayacak bir şey olduğunu varsayalım. Projenin Github sayfasında bir sorun yayınladım. Serializer'in __init__'sindeki basit bir kontrol, hile yapmalı ve kutunun dışında çalışmalıdır. – Raphael

+0

güzel, sonuçtan bana haber ver;) –