21

我有这样的要求:

$http({ 
    method: 'POST', 
    url: '/url/', 
    data: 'test=data'
})

在我的 Django 视图中:

class SomeClass(View):
    def get(self, request):
        return HttpResponse("Hello")
    def post(self, request):
        print request.post
        print request.body
        return HttpResponse("Done")

所以当我这样做时,request.POST 我得到一个空的查询 dict :<QueryDict: {}>

但我request.body有:test=data

所以我相信 django 将数据作为 url 编码的参数而不是作为字典接收。

如何以 JSON/Dict 形式发送或接收这些数据?

4

6 回答 6

45

调用 ajax 时,您会在请求正文中收到编码的 json 字符串,因此您需要使用 python 的 json 模块对其进行解码以获取 python dict:

json.loads(request.body)
于 2013-09-24T12:43:39.583 回答
14

在我的情况下,像

$http({
    url: '/url/',
    method: "POST",
    data: $.param(params),
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    }
})

或更漂亮的变体:

app.config ($httpProvider) ->
    ...
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

进而

$scope.save_result = $http.post('/url/', $.param(params))

http://www.daveoncode.com/2013/10/17/how-to-make-angularjs-and-django-play-nice-together/

于 2013-10-31T15:35:16.887 回答
2

我正在使用 zope2,其中我使用simplejson将请求 json 解码为 python 字典,如下所示:

request_dict = simplejson.loads(request.get('BODY','')

它对我来说工作正常。通过这种方式,我可以使用 angularjs 默认的 json 请求,而不是将其转换为表单帖子。

于 2014-07-21T00:55:40.833 回答
2

我通过创建装饰器稍微改进了 mariodev 的解决方案:

# Must decode body of angular's JSON post requests
def json_body_decoder(my_func):
    def inner_func(request, *args, **kwargs):
        body = request.body.decode("utf-8")
        request.POST = json.loads(body)
        return my_func(request, *args, **kwargs)
    return inner_func

 @json_body_decoder
 def request_handler(request):
     # request.POST is a dictionary containing the decoded body of the request

现在,@json_body_decoder每当我创建一个处理application/json.

于 2016-06-26T01:20:40.607 回答
1

对于 Angular 4 和 Django Rest Framework 用于request.data获取 json 对象。

像:

posted_data = request.data

于 2017-09-26T09:36:21.610 回答
0

$http服务需要一个 JS 对象,而不是字符串。试试这个:

$http({ 
    method: 'POST', 
    url: '/url/', 
    data: {test: 'data'}
})
于 2013-09-24T10:36:14.373 回答