Подтвердить что ты не робот

Отправка почтовых данных из angularjs в django как JSON, а не как исходное содержимое

У меня есть запрос вроде этого:

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

4b9b3361

Ответ 1

При вызове ajax вы получаете закодированную строку json в тело запроса, поэтому вам нужно декодировать ее с помощью модуля python json, чтобы получить python dict:

json.loads(request.body)

Ответ 2

В моем случае работает что-то вроде

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

Ответ 3

Я использую zope2, где я использовал simplejson, чтобы декодировать запрос json в словарь python как:

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

Он работает правильно для меня. Таким образом, я могу использовать запрос anglockjs по умолчанию json, а не преобразовывать его в сообщение формы.

Ответ 4

Я немного улучшил решение mariodev, создав декоратор:

# Must decode body of angular 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 всякий раз, когда создаю обработчик запросов, который обрабатывает данные post в application/json.

Ответ 5

Для angular 4 и Django Rest Framework используйте request.data, чтобы получить объект json.

как:

posted_data = request.data

Ответ 6

Служба $http ожидает объект JS, а не строку. Попробуйте следующее:

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