Ответ 1
При вызове ajax вы получаете закодированную строку json в тело запроса, поэтому вам нужно декодировать ее с помощью модуля python json, чтобы получить python dict:
json.loads(request.body)
У меня есть запрос вроде этого:
$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?
При вызове ajax вы получаете закодированную строку json в тело запроса, поэтому вам нужно декодировать ее с помощью модуля python json, чтобы получить python dict:
json.loads(request.body)
В моем случае работает что-то вроде
$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/
Я использую zope2, где я использовал simplejson, чтобы декодировать запрос json в словарь python как:
request_dict = simplejson.loads(request.get('BODY','')
Он работает правильно для меня. Таким образом, я могу использовать запрос anglockjs по умолчанию json, а не преобразовывать его в сообщение формы.
Я немного улучшил решение 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
.
Для angular 4 и Django Rest Framework используйте request.data
, чтобы получить объект json.
как:
posted_data = request.data
Служба $http
ожидает объект JS, а не строку. Попробуйте следующее:
$http({
method: 'POST',
url: '/url/',
data: {test: 'data'}
})