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

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

_,ABC_2是请求上的ABC_1的_,但我不知道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密钥中显然没有密钥。

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

249121 次浏览

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,我认为您需要_Django上的ABC_0(request.raw_post_data)<;1.4).这将为您提供通过POST发送的原始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);
}
});

姜戈:

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

姜戈<;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发布数据是:

//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);

在这种情况下,您需要使用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")

request.raw_response现已弃用。而是使用request.body来处理非常规表单数据,例如XML有效负载、二进制图像等。

关于这个问题的Django文档

request.raw_post_data已弃用。使用request.body代替

方法1

客户:作为_发送ABC_0

$.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

客户:作为_发送ABC_0 (注意:contentType&;processData已更改,_不需要ABC_2)

$.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

服务器:

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

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

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

可能有关系

  • https://groups.google.com/forum/#!msg/django-developers/s8oz9ynh-8c/ywey138tpfej.
  • https://code.djangoproject.com/ticket/17942。已在1.7中修复
  • http://homakov.blogspot.in/2012/06/x-www-form-urlencoded-vs-json-pros-and.html.

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 code


file name  : view.html




<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
$("#mySelect").change(function(){
selected = $("#mySelect option:selected").text()
$.ajax({
type: 'POST',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
url: '/view/',
data: {
'fruit': selected
},
success: function(result) {
document.write(result)
}
});
});
});
</script>
</head>
<body>


<form>
<br>
Select your favorite fruit:
<select id="mySelect">
<option value="apple" selected >Select fruit</option>
<option value="apple">Apple</option>
<option value="orange">Orange</option>
<option value="pineapple">Pineapple</option>
<option value="banana">Banana</option>
</select>
</form>
</body>
</html>


Django code:




Inside views.py




def view(request):


if request.method == 'POST':
print request.body
data = request.body
return HttpResponse(json.dumps(data))

使用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有一种不同的方式来表示字符串-它们是字节数组。

使用Django1.9和Python2.7并在主体(而不是头)中发送JSON数据,您将使用如下内容:

mydata = json.loads(request.body)

但对于Django1.9和Python3.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")

如果您在Django设置中设置了REST_framework.parsers.JSONParser 然后,您的JSON将位于请求对象的数据属性中。

要访问它:

def post(self, request):
json_data = request.data

这里有一个类似的答案。