209 votos

Creación de una respuesta JSON con Django y Python

Estoy intentando convertir una respuesta Ajax del lado del servidor script en un HttpResponse de Django, pero aparentemente no funciona.

Este es el script del lado del servidor:

/* 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.
        }
    }
}

Y este es el código convertido

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))

Estoy usando simplejson para codificar la lista de Python (para que devuelva un Array JSON). Todavía no he podido averiguar el problema. Pero creo que hice algo mal con el 'eco'.

486voto

Tom Puntos 7393

Normalmente uso un diccionario, no una lista para devolver el contenido JSON.

import json

from django.http import HttpResponse

response_data = {}
response_data['result'] = 'failed'
response_data['message'] = 'You messed up'
return HttpResponse(json.dumps(response_data), content_type="application/json")

117voto

Dingo Puntos 1417

Yo uso esto y funciona bien.

from django.utils import simplejson

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

Alternativa:

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,
        )

En Django 1.7 JsonResponse se han añadido al propio framework de Django, lo que facilita aún más esta tarea:

def some_view(request):
    return JsonResponse({"key": "value"})

98voto

srj Puntos 399

Nuevo en django 1.7

puedes usar JsonResponse objetos.

de los documentos:

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

12voto

Dmitry Demidenko Puntos 2118
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)

Y en la vista:

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

7voto

ReduxDJ Puntos 79

Querrás usar el serializador de django para ayudarte con las cosas unicode:

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")

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X