Django 및 Python을 사용하여 JSON 응답 작성


452

서버 측 Ajax 응답 스크립트를 Django HttpResponse로 변환하려고하는데 작동하지 않습니다.

이것은 서버 측 스크립트입니다.

/* RECEIVE VALUE */
$validateValue=$_POST['validateValue'];
$validateId=$_POST['validateId'];
$validateError=$_POST['validateError'];

/* RETURN VALUE */
$arrayToJs = array();
$arrayToJs[0] = $validateId;
$arrayToJs[1] = $validateError;

if($validateValue =="Testuser"){  // Validate??
    $arrayToJs[2] = "true";       // RETURN TRUE
    echo '{"jsonValidateReturn":'.json_encode($arrayToJs).'}';  // RETURN ARRAY WITH success
}
else{
    for($x=0;$x<1000000;$x++){
        if($x == 990000){
            $arrayToJs[2] = "false";
            echo '{"jsonValidateReturn":'.json_encode($arrayToJs).'}';   // RETURNS ARRAY WITH ERROR.
        }
    }
}

그리고 이것은 변환 된 코드입니다

def validate_user(request):
    if request.method == 'POST':
        vld_value = request.POST.get('validateValue')
        vld_id = request.POST.get('validateId')
        vld_error = request.POST.get('validateError')

        array_to_js = [vld_id, vld_error, False]

        if vld_value == "TestUser":
            array_to_js[2] = True
            x = simplejson.dumps(array_to_js)
            return HttpResponse(x)
        else:
            array_to_js[2] = False
            x = simplejson.dumps(array_to_js)
            error = 'Error'
            return render_to_response('index.html',{'error':error},context_instance=RequestContext(request))
    return render_to_response('index.html',context_instance=RequestContext(request))

파이썬 목록을 인코딩하기 위해 simplejson을 사용하고 있습니다 (따라서 JSON 배열을 반환합니다). 아직 문제를 파악할 수 없었습니다. 그러나 나는 '에코'에 대해 뭔가 잘못했다고 생각합니다.


django-annoying view decorator를 사용할 수도 있습니다 @ajax_request.
zopieux

답변:


917

나는 보통 JSON 콘텐츠를 반환하기 위해 목록이 아닌 사전을 사용합니다.

import json

from django.http import HttpResponse

response_data = {}
response_data['result'] = 'error'
response_data['message'] = 'Some error message'

장고 1.7 이전에는 다음과 같이 반환합니다.

return HttpResponse(json.dumps(response_data), content_type="application/json")

Django 1.7 이상에서는 다음 JsonResponse과 같이 SO 답변에 표시된대로 사용하십시오 .

from django.http import JsonResponse
return JsonResponse({'foo':'bar'})

4
그것은 이다 MIME 형식이 아닌 문제로 그를 점점해야 목록입니다. 대부분의 JSON은 일반적으로 최상위 수준의 개체 ( "사전")이지만 JSON은 최상위 수준의 배열에 매우 만족합니다.
Thanatos 2016 년

6
죄송하지만 필자가 쓴 내용은 명확하지 않지만 사전을 JSON으로 직렬화 할 때 더 깨끗하고 쉬우므로 사전 만 사용한다는 의미입니다.
Tom

이전 버전의 IE에서는 'application / json'이 올바르게 지원되지 않습니다. 다음은 github.com/blueimp/jQuery-File-Upload/issues/123
Victory

161

장고 1.7의 새로운 기능

JsonResponse 객체를 사용할 수 있습니다 .

문서에서 :

from django.http import JsonResponse
return JsonResponse({'foo':'bar'})

2
한 가지 단점 : 기본값은 ensure_ascii이며 아직 재정의하는 방법을 찾지 못했습니다. 이에 대한 새로운 질문을 작성했습니다 : stackoverflow.com/q/34798703/854477
int_ua

@int_ua : 그냥 추가 json_dumps_params={"ensure_ascii": False}(Django 1.9 이상 필요)
Martijn Pieters

139

나는 이것을 사용한다. 그것은 잘 작동한다.

from django.utils import simplejson
from django.http import HttpResponse

def some_view(request):
    to_json = {
        "key1": "value1",
        "key2": "value2"
    }
    return HttpResponse(simplejson.dumps(to_json), mimetype='application/json')

대안 :

from django.utils import simplejson

class JsonResponse(HttpResponse):
    """
        JSON response
    """
    def __init__(self, content, mimetype='application/json', status=None, content_type=None):
        super(JsonResponse, self).__init__(
            content=simplejson.dumps(content),
            mimetype=mimetype,
            status=status,
            content_type=content_type,
        )

Django 1.7에서는 JsonResponse 객체가 Django 프레임 워크 자체에 추가 되어이 작업이 훨씬 쉬워졌습니다.

from django.http import JsonResponse
def some_view(request):
    return JsonResponse({"key": "value"})

1
문제는 여기에 입력 필드에서 값을 얻지 못하는 것입니다 vld_value = request.POST.get ( 'validateValue')
Switch

2
Python 2.7에서는 "import json"이어야합니다
Cullen Fluffy Jennings

1
나는 from django.utils import simplejson이전 버전과의 호환성을위한 것이라고 생각 합니다.
Skylar Saveland 5

JsonResponse(status=404, data={'status':'false','message':message})
Belter

25

Django 1.7 이후에는 표준 JsonResponse 가 필요합니다.

from django.http import JsonResponse
...
return JsonResponse(array_to_js, safe=False)

배열을 json.dump 할 필요조차 없습니다.


16
from django.http import HttpResponse
import json

class JsonResponse(HttpResponse):
    def __init__(self, content={}, mimetype=None, status=None,
             content_type='application/json'):
        super(JsonResponse, self).__init__(json.dumps(content), mimetype=mimetype,
                                           status=status, content_type=content_type)

그리고보기에서 :

resp_data = {'my_key': 'my value',}
return JsonResponse(resp_data)

15

Django 1.7 이상을 사용하는 사람들

from django.http import JsonResponse

def your_view(request):
    json_object = {'key': "value"}
    return JsonResponse(json_object)

공식 문서


11

django serializer를 사용하여 유니 코드 관련 작업을 수행하려고합니다.

from django.core import serializers

json_serializer = serializers.get_serializer("json")()
    response =  json_serializer.serialize(list, ensure_ascii=False, indent=2, use_natural_keys=True)
    return HttpResponse(response, mimetype="application/json")

2
이것은 내가 선호하는 버전이지만 Django QuerySets 만 먹는다는 것을 깨달았습니다 .
patroqueeet

10

Django Class 기반 뷰를 사용하여 다음을 작성할 수 있습니다.

from django.views import View
from django.http import JsonResponse

class JsonView(View):
    def get(self, request):
        return JsonResponse({'some': 'data'})

Django-Rest-Framework를 사용하면 다음과 같이 작성할 수 있습니다.

from rest_framework.views import APIView
from rest_framework.response import Response

class JsonView(APIView):
    def get(self, request):
        return Response({'some': 'data'})

6

HttpResponse의 하위 클래스 인 JsonResponse 클래스가 있으므로 Django 버전 1.7 이상에서 매우 편리합니다.

from django.http import JsonResponse
    def profile(request):
        data = {
            'name': 'Raghav',
            'location': 'India',
            'is_active': False,
            'count': 28
        }
        return JsonResponse(data)

Django의 이전 버전의 경우 HttpResponse 객체를 사용해야합니다.

import json
from django.http import HttpResponse

def profile(request):
    data = {
        'name': 'Raghav',
        'location': 'India',
        'is_active': False,
        'count': 28
    }
    dump = json.dumps(data)
    return HttpResponse(dump, content_type='application/json')

6

ajax (JSON)에서 Google App Engine을 사용하는 방법은 무엇입니까?

JQuery를 사용한 코드 자바 스크립트 :

$.ajax({
    url: '/ajax',
    dataType : 'json',
    cache: false,
    success: function(data) {
        alert('Load was performed.'+data.ajax_resp);
    }
});

코드 파이썬

class Ajax(webapp2.RequestHandler):
    def get(self):
        my_response = {'ajax_resp':'Hello, webapp World!'}
        datos = json.dumps(my_response)

        self.response.headers.add_header('content-type', 'application/json', charset='utf-8')
        self.response.out.write(datos)

4

이것은 클래스 기반보기를 사용하는 선호하는 버전입니다. 기본 View를 서브 클래 싱하고 get () 메소드를 대체하십시오.

import json

class MyJsonView(View):

    def get(self, *args, **kwargs):
        resp = {'my_key': 'my value',}
        return HttpResponse(json.dumps(resp), mimetype="application/json" )

4

장고 코드 views.py:

def view(request):
    if request.method == 'POST':
        print request.body
        data = request.body
        return HttpResponse(json.dumps(data))

HTML 코드 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>
    {{data}}
    <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>

4

먼저 이것을 가져옵니다.

from django.http import HttpResponse

이미 JSON이있는 경우 :

def your_method(request):
    your_json = [{'key1': value, 'key2': value}]
    return HttpResponse(your_json, 'application/json')

다른 HTTP 요청에서 JSON을 얻는 경우 :

def your_method(request):
    response = request.get('https://www.example.com/get/json')
    return HttpResponse(response, 'application/json')


1

View에서 이것을 사용하십시오 :

form.field.errors|striptags

HTML없이 유효성 검사 메시지를 받기위한

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.