我的传入Django请求中的JSON数据在哪里?

146 python django ajax json content-type

我正在尝试使用Django/Python处理传入的JSON/Ajax请求.

request.is_ajax()True请求,但我不知道有效负载在哪里与JSON数据.

request.POST.dir 包含这个:

['__class__', '__cmp__', '__contains__', '__copy__', '__deepcopy__', '__delattr__',
 '__delitem__', '__dict__', '__doc__', '__eq__', '__ge__', '__getattribute__',
'__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__',
 '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', 
'__setattr__', '__setitem__', '__str__', '__weakref__', '_assert_mutable', '_encoding', 
'_get_encoding', '_mutable', '_set_encoding', 'appendlist', 'clear', 'copy', 'encoding', 
'fromkeys', 'get', 'getlist', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 
'keys', 'lists', 'pop', 'popitem', 'setdefault', 'setlist', 'setlistdefault', 'update', 
'urlencode', 'values']
Run Code Online (Sandbox Code Playgroud)

请求帖子键中显然没有键.

当我在Firebug中查看POST时,请求中会发送JSON数据.

Jar*_*ipp 219

如果您将JSON发布到Django,我认为您想要request.body(request.raw_post_data在Django <1.4上).这将为您提供通过帖子发送的原始JSON数据.从那里你可以进一步处理它.

这是一个使用JavaScript,jQuery,jquery-json和Django 的例子.

JavaScript的:

var myEvent = {id: calEvent.id, start: calEvent.start, end: calEvent.end,
               allDay: calEvent.allDay };
$.ajax({
    url: '/event/save-json/',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: $.toJSON(myEvent),
    dataType: 'text',
    success: function(result) {
        alert(result.Result);
    }
});
Run Code Online (Sandbox Code Playgroud)

Django的:

def save_events_json(request):
    if request.is_ajax():
        if request.method == 'POST':
            print 'Raw Data: "%s"' % request.body   
    return HttpResponse("OK")
Run Code Online (Sandbox Code Playgroud)

Django <1.4:

  def save_events_json(request):
    if request.is_ajax():
        if request.method == 'POST':
            print 'Raw Data: "%s"' % request.raw_post_data
    return HttpResponse("OK")
Run Code Online (Sandbox Code Playgroud)

  • 注意,如果你使用1.4,这将被称为request.body.raw_post_data已弃用... (46认同)
  • 请记住:您应该使用斜杠(/)char结束URL.同时使用@csrf_exempt禁用CSRF (4认同)
  • 用django unittest测试就是`self.client.post('/ event/save-json /',json.dumps(python_dict),HTTP_X_REQUESTED_WITH ='XMLHttpRequest',content_type ="application/json")` (3认同)

str*_*jux 61

我有同样的问题.我一直在发布一个复杂的JSON响应,我无法使用request.POST字典读取我的数据.

我的JSON POST数据是:

//JavaScript code:
//Requires json2.js and jQuery.
var response = {data:[{"a":1, "b":2},{"a":2, "b":2}]}
json_response = JSON.stringify(response); // proper serialization method, read 
                                          // http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
$.post('url',json_response);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您需要使用aurealus提供的方法.读取request.body并使用json stdlib反序列化它.

#Django code:
import json
def save_data(request):
  if request.method == 'POST':
    json_data = json.loads(request.body) # request.raw_post_data w/ Django < 1.4
    try:
      data = json_data['data']
    except KeyError:
      HttpResponseServerError("Malformed data!")
    HttpResponse("Got json data")
Run Code Online (Sandbox Code Playgroud)

  • `django.utils.simplejson`已在最近的版本中删除.只需使用stdlib`json`库. (4认同)
  • 我遇到了第4行的问题:`json_data = simplejson.loads(request.raw_post_data)`你确定正确说明了吗? (2认同)

use*_*ser 33

方法1

客户:发送为 JSON

$.ajax({
    url: 'example.com/ajax/',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    processData: false,
    data: JSON.stringify({'name':'John', 'age': 42}),
    ...
});

//Sent as a JSON object {'name':'John', 'age': 42}
Run Code Online (Sandbox Code Playgroud)

服务器:

data = json.loads(request.body) # {'name':'John', 'age': 42}
Run Code Online (Sandbox Code Playgroud)

方法2

客户:发送x-www-form-urlencoded
(注:contentType&processData变了,JSON.stringify也没必要)

$.ajax({
    url: 'example.com/ajax/',
    type: 'POST',    
    data: {'name':'John', 'age': 42},
    contentType: 'application/x-www-form-urlencoded; charset=utf-8',  //Default
    processData: true,       
});

//Sent as a query string name=John&age=42
Run Code Online (Sandbox Code Playgroud)

服务器:

data = request.POST # will be <QueryDict: {u'name':u'John', u'age': 42}>
Run Code Online (Sandbox Code Playgroud)

更改为1.5+:https://docs.djangoproject.com/en/dev/releases/1.5/#non-form-data-in-http-requests

HTTP请求中的非表单数据 :
request.POST将不再包含通过标头中具有非表单特定内容类型的HTTP请求发布的数据.在以前的版本中,使用除multipart/form-data或application/x-www-form-urlencoded之外的内容类型发布的数据仍将最终在request.POST属性中表示.希望访问这些案例的原始POST数据的开发人员应该使用request.body属性.

大概相关

  • 关于1-django.http.request.RawPostDataException:从请求的数据流读取后,您将无法访问正文 (2认同)

Kev*_*Lin 23

request.raw_response现已弃用.使用request.body,而不是用于处理非传统形式的数据,如XML有效载荷,二进制图像等

Django关于这个问题的文档.


Ric*_*oke 17

重要的是要记住Python 3有一种不同的表示字符串的方式 - 它们是字节数组.

使用Django 1.9和Python 2.7并在主体(而不是标题)中发送JSON数据,您将使用以下内容:

mydata = json.loads(request.body)
Run Code Online (Sandbox Code Playgroud)

但是对于Django 1.9和Python 3.4,你会使用:

mydata = json.loads(request.body.decode("utf-8"))
Run Code Online (Sandbox Code Playgroud)

我刚刚完成了这个学习曲线,制作了我的第一个Py3 Django应用程序!

  • 谢谢你的解释!我正在使用Django 1.10和Python 3.5,mydata = json.loads(request.body.decode("utf-8"))有效! (3认同)

Rub*_*uck 9

在django 1.6 python 3.3上

客户

$.ajax({
    url: '/urll/',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(json_object),
    dataType: 'json',
    success: function(result) {
        alert(result.Result);
    }
});
Run Code Online (Sandbox Code Playgroud)

服务器

def urll(request):

if request.is_ajax():
    if request.method == 'POST':
        print ('Raw Data:', request.body) 

        print ('type(request.body):', type(request.body)) # this type is bytes

        print(json.loads(request.body.decode("utf-8")))
Run Code Online (Sandbox Code Playgroud)


小智 6

像这样的东西。它有效:从客户端请求数据

registerData = {
{% for field in userFields%}
  {{ field.name }}: {{ field.name }},
{% endfor %}
}


var request = $.ajax({
   url: "{% url 'MainApp:rq-create-account-json' %}",
   method: "POST",
   async: false,
   contentType: "application/json; charset=utf-8",
   data: JSON.stringify(registerData),
   dataType: "json"
});

request.done(function (msg) {
   [alert(msg);]
   alert(msg.name);
});

request.fail(function (jqXHR, status) {
  alert(status);
});
Run Code Online (Sandbox Code Playgroud)

在服务器上处理请求

@csrf_exempt
def rq_create_account_json(request):
   if request.is_ajax():
       if request.method == 'POST':
           json_data = json.loads(request.body)
           print(json_data)
           return JsonResponse(json_data)
   return HttpResponse("Error")
Run Code Online (Sandbox Code Playgroud)


Jav*_*ier 5

HTTP POST有效负载只是一堆扁平的字节.Django(与大多数框架一样)根据URL编码参数或MIME多部分编码将其解码为字典.如果您只是将JSON数据转储到POST内容中,Django将不会解码它.从完整的POST内容(不是字典)中进行JSON解码; 或者将JSON数据放入MIME多部分包装器中.

简而言之,显示JavaScript代码.问题似乎就在那里.

  • 在许多情况下,原始表格数据不够; JSON允许您发送分层对象,而不仅仅是键:值对.您可以发送嵌套集,数组等.您可以使用发布数据完成所有这些操作,但这并不方便.总是处理JSON,无论是往返都是一件好事 (4认同)

And*_*res 5

request.raw_post_data已被弃用.请request.body改用