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 .

6voto

Importieren Sie zunächst dies:

from django.http import HttpResponse

Wenn Sie das JSON bereits haben:

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

Wenn Sie das JSON von einer anderen HTTP-Anfrage erhalten:

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

5voto

Rajan Mandanka Punkte 1895

Django-Code views.py :

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

HTML-Code 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>

5voto

droidballoon Punkte 690

Dies ist die von mir bevorzugte Version mit einer klassenbasierten Ansicht. Subclass einfach die grundlegende Ansicht und überschreiben Sie die get()-Methode.

import json

class MyJsonView(View):

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

4voto

devdrc Punkte 1342

Die meisten dieser Antworten sind nicht mehr aktuell. JsonResponse wird nicht empfohlen, weil es die Zeichen umgeht, was normalerweise unerwünscht ist. Hier ist, was ich verwende:

views.py (liefert HTML)

from django.shortcuts import render
from django.core import serializers

def your_view(request):
    data = serializers.serialize('json', YourModel.objects.all())
    context = {"data":data}
    return render(request, "your_view.html", context)

views.py (liefert JSON)

from django.core import serializers
from django.http import HttpResponse

def your_view(request):
    data = serializers.serialize('json', YourModel.objects.all())
    return HttpResponse(data, content_type='application/json')

Bonus für Vue-Benutzer

Wenn Sie Ihr Django Queryset in Vue einbinden wollen, können Sie folgendes tun.

Vorlage.html

<div id="dataJson" style="display:none">
{{ data }}
</div>

<script>
let dataParsed = JSON.parse(document.getElementById('dataJson').textContent);
var app = new Vue({
  el: '#app',
  data: {
    yourVariable: dataParsed,
  },
})
</script>

4voto

Joe Web Punkte 158

Auf diese Weise kann der json-Inhalt als Datei mit einem bestimmten Dateinamen heruntergeladen werden.

import json
from django.http import HttpResponse

def download_json(request):
    data = {'some': 'information'}

    # serialize data obj as a JSON stream 
    data = json.dumps(data)
    response = HttpResponse(data, content_type='application/json charset=utf-8')

    # add filename to response
    response['Content-Disposition'] = 'attachment; filename="filename.json"'
    return response

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