2013-04-25 29 views
8

Tôi đang cố gắng để làm một POST sử dụng curl:Django & TastyPie: request.POST trống

curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"item_id": "1"}' http://www.mylocal.com:8000/api/1/bookmarks/ 

Tuy nhiên, request.POST luôn trống.

Dưới đây là mã ModelResource tôi:

class BookmarkResource(ModelResource): 


    class Meta: 
     queryset = Bookmark.objects.all()  
     resource_name = 'bookmarks' 
     fields = ['id', 'tags'] 
     allowed_methods = ['get', 'post', 'delete', 'put'] 
     always_return_data = True 
     authorization= Authorization() 
     include_resource_uri = False 

    def determine_format(self, request): 
     return "application/json" 

    def obj_create(self, bundle, **kwargs): 

     request = bundle.request 

     try: 
      payload = simplejson.loads(request.POST.keys()[0]) 
     except: 
      payload = simplejson.loads(request.POST.keys()) 

Bất kỳ ai biết những gì tôi đang thiếu?

Xin cảm ơn trước.

Trả lời

29

Bắt đầu từ Django 1.5, POST không chứa dữ liệu không phải biểu mẫu nữa. Họ hiện đang ở request.body.

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.POST

+0

Xem thêm http://stackoverflow.com/questions/1208067/wheres-my-json-data-in-my-incoming-django-request. – Seth

+1

@dannyroa Điều gì phân biệt "dữ liệu biểu mẫu" và "dữ liệu không phải dạng"? – rrauenza

+1

... Nhìn vào nguồn Django, có vẻ như nó được định nghĩa trong '_load_post_and_files()' và phụ thuộc vào 'CONTENT_TYPE' -' multipart/form-data' và 'application/x-www-form-urlencoded' – rrauenza

0

Tôi không phải là cURL mong đợi nhưng sao chép một yêu cầu POST ra các công cụ dev Chrome của tôi --data trông như sau:

--data "foo=bar&bar=foo"

Vì vậy, có vẻ như bạn có thể muốn thay đổi lệnh của bạn để:

--data item_id="1"

Side lưu ý: tôi rất có thể đề nghị một trong các followin g Chrome apps để làm các yêu cầu HTTP:

Advanced REST client HOẶC Dev HTTP Client

Ngoài ra nếu bạn có thể thực hiện cuộc gọi trong một trình duyệt (theo mẫu nộp hoặc ví dụ tương tự) sau đó trong bảng điều khiển công cụ dev mạng Chrome, bạn có thể sao chép các yêu cầu như một lệnh cURL (nhấp chuột phải vào nó)

+0

Tôi đã thử ứng dụng CHART REST Client & Tôi gặp vấn đề tương tự. – dannyroa

+0

Bạn đã thử pdb/ipdb để xem những gì có sẵn trên 'yêu cầu'? – rockingskier

+0

Vâng, tôi đã sử dụng ipdb để theo dõi qua nó. Trên REST Client, tôi đặt Content-Type thành "application/json". – dannyroa