source

들어오는 장고 요청의 JSON 데이터는 어디 있나요?

manysource 2023. 2. 8. 19:47

들어오는 장고 요청의 JSON 데이터는 어디 있나요?

JSON/Ajax의 착신 요청을 Django/Python으로 처리하려고 합니다.

request.is_ajax()TrueJSON 데이터가 있는 페이로드가 어디에 있는지 알 수 없습니다.

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_data1 . 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 속성을 지정합니다.

관련이 있을 것 같다

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