21

I have a request like this:

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

In my django views:

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

So when I do request.POST I get an empty query dict :<QueryDict: {}>

But my request.body has: test=data

So I believe django receives the data as url-encoded parameters and not as a dictionary.

How do I send or receive this data as JSON/Dict ?

4

6 に答える 6

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

デコレータを作成することで、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 に答える
2

私はzope2を使用しており、simplejsonを使用してリクエストjsonをPython辞書にデコードしました。

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

それは私にとって正しく機能しています。このようにして、フォーム投稿に変換するのではなく、angularjs のデフォルトの json リクエストを使用できます。

于 2014-07-21T00:55:40.833 に答える
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 に答える