들어오는 장고 요청의 JSON 데이터는 어디 있나요?
JSON/Ajax의 착신 요청을 Django/Python으로 처리하려고 합니다.
request.is_ajax()
이True
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']
요청 포스트 키에 키가 없는 것 같습니다.
Firebug의 POST를 보면 요청 중에 JSON 데이터가 올라오고 있습니다.
장고에게 JSON을 올리시는 분들은request.body
(request.raw_post_data
1 . 4 ) 。그러면 우편을 통해 전송된 원시 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 응답을 투고하고 있었기 때문에, 그 요청으로 데이터를 읽을 수 없었습니다.POST 딕셔너리
JSON POST 데이터는 다음과 같습니다.
//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가 제공하는 방법을 사용해야 합니다.요청을 읽습니다.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")
방법 1
클라이언트 : Send as (다음으로 송신)JSON
$.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
클라이언트 : Send as (다음으로 송신)x-www-form-urlencoded
(주의:contentType
&processData
변했습니다.JSON.stringify
불필요)
$.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-data-in-displays
HTTP 요청에 형식이 아닌 데이터가 있습니다.
부탁한다.POST 에서는, HTTP 요구를 개입시켜 투고된 데이터(폼 고유의 컨텐츠 타입이 아닌 데이터)는 헤더에 포함되지 않게 됩니다.이전 버전에서는 멀티파트/폼 데이터 또는 애플리케이션/x-www-form-urlencoded 이외의 콘텐츠 타입으로 게시된 데이터는 여전히 요청에 표시됩니다.POST 아트리뷰트개발자는 이러한 경우에 대해 미가공 POST 데이터에 액세스하고자 하는 경우 요청을 사용해야 합니다.대신 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
Python 3은 문자열을 표현하는 방법이 다릅니다. 즉, 바이트 배열입니다.
Django 1.9와 Python 2.7을 사용하여 JSON 데이터를 (헤더가 아닌) 본체로 전송하면 다음과 같은 방법을 사용할 수 있습니다.
mydata = json.loads(request.body)
그러나 Django 1.9 및 Python 3.4의 경우 다음을 사용합니다.
mydata = json.loads(request.body.decode("utf-8"))
나는 나의 첫 번째 Py3 장고 앱을 만들기 위해 이 학습 곡선을 막 밟았다.
request.raw_response
을 사용하다request.body
대신 XML 페이로드, 바이너리 이미지 등과 같은 일반적이지 않은 폼 데이터를 처리합니다.
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")))
이런 거.성공: 클라이언트에 데이터 요청
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")
HTTP POST payload는 플랫한 바이트 묶음일 뿐입니다.대부분의 프레임워크와 마찬가지로 Django는 URL 부호화 파라미터 또는 MIME 멀티파트 부호화 중 하나를 사용하여 사전에 디코딩합니다.POST 콘텐츠에 JSON 데이터를 덤프하면 Django는 디코딩하지 않습니다.(사전이 아닌) 완전한 POST 콘텐츠에서 JSON 디코딩을 수행하거나 JSON 데이터를 MIME 멀티파트 래퍼에 넣습니다.
즉, JavaScript 코드를 표시합니다.문제는 거기에 있는 것 같다.
request.raw_post_data
을 사용하다request.body
대신에
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))
rest_framework.parsers 를 설정한 경우.jSONParser in your django settings 그러면 json은 요청 객체의 데이터 속성에 있게 됩니다.
액세스 방법:
def post(self, request):
json_data = request.data
헤더를 추가하거나 헤더에 .Angular는 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'}
})
부탁한다.POST는 단지 사전과 같은 오브젝트이기 때문에 dict 구문을 사용하여 인덱스를 작성하기만 하면 됩니다.
양식 필드가 Fred인 경우 다음과 같은 작업을 수행할 수 있습니다.
if 'fred' in request.POST:
mydata = request.POST['fred']
또는 폼 오브젝트를 사용하여 POST 데이터를 처리합니다.
언급URL : https://stackoverflow.com/questions/1208067/wheres-my-json-data-in-my-incoming-django-request
'source' 카테고리의 다른 글
react Material-ui. onClick for 버튼을 사용할 수 있는지 어떻게 알 수 있습니까? (0) | 2023.02.12 |
---|---|
스프링 보안 로그인 화면을 비활성화하려면 어떻게 해야 합니까? (0) | 2023.02.12 |
UNION을 사용할 때 json[] 유형의 등호 연산자를 식별할 수 없습니다. (0) | 2023.02.08 |
testing-library-react의 "update was not wraped in act()" 경고를 해결하려면 어떻게 해야 합니까? (0) | 2023.02.08 |
Json 문자열을 C# 객체 목록으로 변환 (0) | 2023.02.08 |