588 Stimmen

Erstellen einer JSON-Antwort mit Django und Python

Ich versuche, eine Server-Seite Ajax-Antwort-Skript in eine Django HttpResponse zu konvertieren, aber offenbar ist es nicht funktioniert.

Dies ist das serverseitige Skript:

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

Und so sieht der umgewandelte Code aus

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

Ich verwende simplejson, um die Python-Liste zu kodieren (so dass es ein JSON-Array zurückgibt). Ich konnte das Problem noch nicht herausfinden. Aber ich denke, dass ich etwas falsch mit dem 'echo' gemacht habe.

0 Stimmen

Sie können auch den lästigen django-View-Dekorator verwenden @ajax_request .

1106voto

Tom Punkte 21091

Ich verwende in der Regel ein Wörterbuch und keine Liste, um JSON-Inhalte zurückzugeben.

import json

from django.http import HttpResponse

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

Vor Django 1.7 würden Sie es so zurückgeben:

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

Für Django 1.7+, verwenden Sie JsonResponse wie gezeigt in diese SO-Antwort etwa so:

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

205voto

srj Punkte 8823

Neu in django 1.7

könnten Sie verwenden JsonResponse Objekte.

aus den Unterlagen:

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

157voto

Dingo Punkte 2476

Ich benutze dies, es funktioniert gut.

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

Alternativ:

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

In Django 1.7 JsonResponse Objekte zum Django-Framework selbst hinzugefügt worden, was diese Aufgabe noch einfacher macht:

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

27voto

elim Punkte 1164

Mit Django können Sie klassenbasierte Ansichten schreiben:

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

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

und mit Django-Rest-Framework können Sie schreiben:

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

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

27voto

Akhorus Punkte 2193

Seit Django 1.7 haben Sie eine Standard JsonResponse das ist genau das, was Sie brauchen:

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

Sie müssen Ihr Array nicht einmal mit json.dump auslesen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X