Membuat respons JSON menggunakan Django dan Python

451

Saya mencoba untuk mengubah skrip respons sisi server Ajax menjadi Django HttpResponse, tetapi tampaknya itu tidak berfungsi.

Ini adalah skrip sisi server:

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

Dan ini adalah kode yang dikonversi

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

Saya menggunakan simplejson untuk menyandikan daftar Python (sehingga akan mengembalikan array JSON). Saya belum bisa memecahkan masalahnya. Tapi saya pikir saya melakukan kesalahan tentang 'echo'.

Beralih
sumber
Anda juga dapat menggunakan dekorator tampilan django yang mengganggu @ajax_request.
zopieux

Jawaban:

917

Saya biasanya menggunakan kamus, bukan daftar untuk mengembalikan konten JSON.

import json

from django.http import HttpResponse

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

Pra-Django 1.7 Anda akan mengembalikannya seperti ini:

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

Untuk Django 1.7+, gunakan JsonResponseseperti yang ditunjukkan dalam jawaban SO ini seperti:

from django.http import JsonResponse
return JsonResponse({'foo':'bar'})
Tom
sumber
4
Ini adalah mimetype, bukan daftar yang seharusnya membuatnya bermasalah. Sementara sebagian besar JSON biasanya merupakan objek ("kamus") di tingkat atas, JSON sangat senang dengan array di tingkat atas.
Thanatos
6
Maaf, tidak jelas dari apa yang saya tulis, tetapi saya hanya bermaksud menggunakan kamus karena lebih bersih / mudah ketika membuat serial menjadi JSON.
Tom
'application / json' tidak didukung dengan benar di versi IE yang lebih lama. Berikut adalah beberapa diskusi tentang masalah ini github.com/blueimp/jQuery-File-Upload/issues/123
Victory
161

Baru di django 1.7

Anda bisa menggunakan objek JsonResponse .

dari dokumen:

from django.http import JsonResponse
return JsonResponse({'foo':'bar'})
srj
sumber
2
Satu kelemahan: defaultnya adalah ensure_asciidan saya belum menemukan cara untuk menimpanya. Membuat pertanyaan baru untuk ini: stackoverflow.com/q/34798703/854477
int_ua
@int_ua: tambahkan saja json_dumps_params={"ensure_ascii": False}(memerlukan Django 1.9 atau lebih baru)
Martijn Pieters
139

Saya menggunakan ini, itu berfungsi dengan baik.

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

Alternatif:

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

Dalam Django 1.7 objek JsonResponse telah ditambahkan ke kerangka Django itu sendiri yang membuat tugas ini lebih mudah:

from django.http import JsonResponse
def some_view(request):
    return JsonResponse({"key": "value"})
Dingo
sumber
1
Masalahnya adalah di sini ia tidak mendapatkan nilai dari bidang input vld_value = request.POST.get ('validateValue')
Beralih
2
Dengan python 2.7, seharusnya hanya "import json"
Cullen Fluffy Jennings
1
Saya pikir from django.utils import simplejsonini untuk kompatibilitas ke belakang.
Skylar Saveland
JsonResponse(status=404, data={'status':'false','message':message})
Belter
25

Sejak Django 1.7 Anda memiliki JsonResponse standar yang persis seperti yang Anda butuhkan:

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

Anda bahkan tidak perlu json.dump array Anda.

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

Dan dalam tampilan:

resp_data = {'my_key': 'my value',}
return JsonResponse(resp_data)
Dmitry Demidenko
sumber
15

Bagi mereka yang menggunakan Django 1.7+

from django.http import JsonResponse

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

dokumen resmi

Andres
sumber
11

Anda akan ingin menggunakan serializer django untuk membantu dengan hal-hal 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")
ReduxDJ
sumber
2
Ini adalah versi yang saya sukai, tetapi menyadari bahwa itu hanya makan Django QuerySets .
patroqueeet
10

Dengan tampilan berbasis Django Class Anda dapat menulis:

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

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

dan dengan Django-Rest-Framework Anda dapat menulis:

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

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

Sangat nyaman dengan Django versi 1.7 atau lebih tinggi karena Anda memiliki kelas JsonResponse, yang merupakan subkelas dari HttpResponse.

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

Untuk versi Django yang lebih lama, Anda harus menggunakan objek 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')
Tanmay D
sumber
6

Bagaimana cara menggunakan mesin aplikasi google dengan ajax (json)?

Kode Javascript dengan JQuery:

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

Kode Python

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)
Samiro
sumber
4

Ini adalah versi pilihan saya menggunakan tampilan berbasis kelas. Cukup subkelas Tampilan dasar dan ganti metode get () -.

import json

class MyJsonView(View):

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

Kode Django views.py:

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

Kode 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>
Rajan Mandanka
sumber
4

Impor ini dulu:

from django.http import HttpResponse

Jika Anda sudah memiliki JSON:

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

Jika Anda mendapatkan JSON dari permintaan HTTP lain:

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

Gunakan JsonResponse

from django.http import JsonResponse
Suraj Verma
sumber
Jawaban ini membutuhkan konteks dan penjelasan.
theUtherSide
1

Dalam Tampilan gunakan ini:

form.field.errors|striptags

untuk mendapatkan pesan validasi tanpa html

Deepak Sharma
sumber