Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 其中';在传入的Django请求中有我的JSON数据吗?_Python_Ajax_Json_Django_Content Type - Fatal编程技术网

Python 其中';在传入的Django请求中有我的JSON数据吗?

Python 其中';在传入的Django请求中有我的JSON数据吗?,python,ajax,json,django,content-type,Python,Ajax,Json,Django,Content Type,我试图用Django/Python处理传入的JSON/Ajax请求 在请求中为True,但我不知道JSON数据的有效负载在哪里 request.POST.dir包含以下内容: ['__class__', '__cmp__', '__contains__', '__copy__', '__deepcopy__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__eq__', '__ge__', '__getattribute__',

我试图用Django/Python处理传入的JSON/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']
请求后密钥中显然没有密钥


当我在中查看POST时,请求中发送了JSON数据。

request.POST只是一个类似字典的对象,所以只需使用dict语法对其进行索引即可

假设表单字段为fred,则可以执行以下操作:

if 'fred' in request.POST:
    mydata = request.POST['fred']

或者,使用表单对象来处理POST数据。

HTTP POST负载只是一堆扁平的字节。Django(和大多数框架一样)通过URL编码参数或MIME多部分编码将其解码到字典中。如果您只是在POST内容中转储JSON数据,Django将不会对其进行解码。或者从完整的帖子内容(而不是字典)进行JSON解码;或者将JSON数据放入MIME多部分包装器中


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

如果您要将JSON发布到Django,我想您需要
请求.body
请求.raw\u post\u数据
在Django<1.4上)。这将为您提供通过post发送的原始JSON数据。从那里你可以进一步处理它

下面是一个使用JavaScript、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);
    }
});
Django:

def save_events_json(request):
    if request.is_ajax():
        if request.method == 'POST':
            print 'Raw Data: "%s"' % request.body   
    return HttpResponse("OK")
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")

我也有同样的问题。我发布了一个复杂的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);
在这种情况下,您需要使用Aurelus提供的方法。读取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")
#Django代码:
导入json
def保存_数据(请求):
如果request.method==“POST”:
json_data=json.loads(request.body)#request.raw_post_数据w/Django<1.4
尝试:
data=json_data['data']
除KeyError外:
HttpResponseServerError(“数据格式错误!”)
HttpResponse(“获取json数据”)

请求。原始响应现在已被弃用。使用
request.body
来处理非常规表单数据,如XML有效负载、二进制图像等


.

请求。原始发布数据已被弃用。使用
request.body
代替方法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}
服务器:

data = json.loads(request.body) # {'name':'John', 'age': 42}
方法2

客户端:发送为
x-www-form-urlencoded

(注意:
contentType
processData
已更改,
JSON。不需要stringify

服务器:

data = request.POST # will be <QueryDict: {u'name':u'John', u'age': 42}>
data=request.POST#将

更改为1.5+:

HTTP请求中的非表单数据
request.POST将不再包括通过HTTP请求发布的数据 标题中的非表单特定内容类型。在以前的版本中,数据 使用多部分/表单数据或 application/x-www-form-urlencoded仍将以 request.POST属性。希望访问原始帖子的开发人员 这些情况下的数据应改为使用request.body属性

可能相关

  • 。固定在1.7中

  • 在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);
        }
    });
    
    服务器

    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")))
    
    html代码
    文件名:view.html
    $(文档).ready(函数(){
    $(“#mySelect”).change(函数(){
    selected=$(“#mySelect选项:selected”).text()
    $.ajax({
    键入:“POST”,
    数据类型:“json”,
    contentType:'application/json;charset=utf-8',
    url:“/view/”,
    数据:{
    “水果”:已选中
    },
    成功:功能(结果){
    文件写入(结果)
    }
    });
    });
    });
    
    选择您喜爱的水果: 挑选水果 苹果 橙色 菠萝 香蕉 Django代码: 内部视图.py def视图(请求): 如果request.method==“POST”: 打印请求。正文 data=request.body 返回HttpResponse(json.dumps(数据))
    使用Angular,您应该将标题添加到请求或添加到模块配置中 标题:
    {'Content-Type':'application/x-www-form-urlencoded'}

    $http({
        url: url,
        method: method,
        timeout: timeout,
        data: data,
        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    })
    

    重要的是要记住,Python3有一种不同的方式来表示字符串——它们是字节数组

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

    mydata = json.loads(request.body)
    
    但对于Django 1.9和Python 3.4,您将使用:

    mydata = json.loads(request.body.decode("utf-8"))
    

    我刚刚完成了我的第一个Py3 Django应用程序的学习过程

    类似这样的。成功了: 从客户端请求数据

    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);
    });
    
    在服务器上处理请求

    @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")
    

    你到底在发布什么?向我们展示javascript调用。和
    len(request.POST)
    request.POST.items()
    也会有帮助。我正在查看request.POST['json'],它不包含任何内容。len当时是0,正如Daniel所建议的那样,查看JavaScript调用肯定会有帮助。只有当POST请求的主体是表单编码时,才会填充request.POST,否则它是空的。我现在看到问题了!jquery中的type='json'参数指的是预期的类型,而不是它发送的内容。它发送的是常规格式的后编码数据,所以如果我想发送“json”,我需要以某种方式将其转换为字符串,并传递“json={foo:bar,}”等,但我不敢相信,大多数人都是这样做的。我这里肯定遗漏了什么。实际上,您可以使用.serialize()函数在jQuery中将表单转换为JSON字符串。但是,为什么您特别需要发送json呢?只发送表单数据有什么问题?在许多情况下,原始表单数据
    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);
    });
    
    @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")