2014-03-13 6 views
14

ich eine seltsame Sache mit Django erlebe, hier ist mein views.py:Django kann nicht raw_post_data zugreifen

def api(request): 
    return HttpResponse("%s %s" % (request.method,request.raw_post_data)) 

Jetzt habe ich eine HTTP-POST mit POSTMAN (kleine App für Google Chrome) machen.

Ich setzte POSTMAN, um eine POST-Anfrage mit "Test" im rohen Feld zu machen.

Django gibt mir 3 verschiedene Sache (random):

Irgendwann Django kehrt 'GET' irgendwann gar nichts und irgendwann:

AttributeError at/
'WSGIRequest' object has no attribute 'raw_post_data' 
Request Method: GET 
Request URL: https://api.mywebsiteurl.com/ 
Django Version: 1.6.2 
Exception Type: AttributeError 
Exception Value:  
'WSGIRequest' object has no attribute 'raw_post_data' 
Exception Location: /home/spice_dj/spice/views.py in api, line 17 
Python Executable: /usr/bin/python 
Python Version: 2.7.3 
Python Path:  
['/usr/local/lib/python2.7/dist-packages/South-0.8.4-py2.7.egg', 
'/usr/lib/python2.7', 
'/usr/lib/python2.7/plat-linux2', 
'/usr/lib/python2.7/lib-tk', 
'/usr/lib/python2.7/lib-old', 
'/usr/lib/python2.7/lib-dynload', 
'/usr/local/lib/python2.7/dist-packages', 
'/usr/lib/python2.7/dist-packages', 
'/home/spice_dj'] 
Server time: Wed, 12 Mar 2014 22:51:11 -0400 
  1. Warum Django mich zurück 'GET', wenn ich eindeutig eine POST-Anfrage stellen?

  2. Warum gibt es mir diesen Fehler zurück?

  3. Warum gibt es mir nicht den 'Test' zurück, den ich im rohen Feld einstelle?

Antwort

34

Nach django 1.6 deprecation timeline:

Das Attribut HttpRequest.raw_post_data wurde HttpRequest.body in 1.4 umbenannt. Die Abwärtskompatibilität wird entfernt - HttpRequest.raw_post_data wird nicht mehr funktionieren.

Die Motivation ist in der relevant ticket beschrieben:

request.raw_post_dat a ist ein schlechter Name. Es hat nichts mit POST in insbesondere zu tun, es ist nur der Körper der HTTP-Anfrage. Das verwirrt die Benutzer und lässt es so aussehen, als würde Django nicht verstehen, wie HTTP funktioniert. Wir sollten den Namen in request.body ändern und einen Deprecation-Prozess starten.

Verwendung request.body:

def api(request): 
    return HttpResponse("%s %s" % (request.method, request.body)) 

Hoffnung, das hilft.