Tạo phản hồi JSON bằng Django và Python


451

Tôi đang cố gắng chuyển đổi tập lệnh phản hồi Ajax phía máy chủ thành Django HttpResponse, nhưng dường như nó không hoạt động.

Đây là kịch bản phía máy chủ:

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

Và đây là mã chuyển đổi

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

Tôi đang sử dụng Simplejson để mã hóa danh sách Python (vì vậy nó sẽ trả về một mảng JSON). Tôi chưa thể tìm ra vấn đề. Nhưng tôi nghĩ rằng tôi đã làm điều gì đó sai về 'tiếng vang'.


Bạn cũng có thể sử dụng trang trí xem django gây phiền nhiễu @ajax_request.
zopieux

Câu trả lời:


917

Tôi thường sử dụng một từ điển, không phải danh sách để trả về nội dung JSON.

import json

from django.http import HttpResponse

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

Pre-Django 1.7 bạn sẽ trả lại nó như thế này:

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

Đối với Django 1.7+, hãy sử dụng JsonResponsenhư thể hiện trong câu trả lời SO này như sau:

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

4
Đó mimetype, không phải là danh sách nên khiến anh ta gặp rắc rối. Mặc dù hầu hết JSON thường là một đối tượng ("từ điển") ở cấp cao nhất, JSON hoàn toàn hài lòng với một mảng ở cấp cao nhất.
Thanatos

6
Xin lỗi, nó không rõ ràng từ những gì tôi đã viết, nhưng tôi chỉ có nghĩa là tôi sử dụng một từ điển vì nó sạch hơn / dễ dàng hơn khi tuần tự hóa nó thành JSON.
Tom

'application / json' không được hỗ trợ đúng cách trong các phiên bản IE cũ hơn. Dưới đây là một số thảo luận về vấn đề github.com/blueimp/jQuery-File-Upload/issues/123
Chiến thắng

161

Mới trong django 1.7

bạn có thể sử dụng các đối tượng JsonResponse .

từ các tài liệu:

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

2
Một nhược điểm: nó mặc định ensure_asciivà tôi chưa tìm được cách ghi đè lên nó. Tạo một câu hỏi mới cho điều này: stackoverflow.com/q/34798703/854477
int_ua

@int_ua: chỉ cần thêm json_dumps_params={"ensure_ascii": False}(yêu cầu Django 1.9 trở lên)
Martijn Pieters

139

Tôi sử dụng nó, nó hoạt động tốt.

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

Thay thế:

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

Trong Django 1.7, các đối tượng JsonResponse đã được thêm vào khung Django, giúp cho công việc này trở nên dễ dàng hơn:

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

1
Vấn đề là ở đây, nó không nhận được giá trị từ trường đầu vào vld_value = request.POST.get ('validateValue')
Chuyển

2
Với python 2.7, nó chỉ là "nhập json"
Cullen Fluffy Jennings

1
Tôi nghĩ from django.utils import simplejsonlà để tương thích ngược.
Skylar Saveland

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

25

Kể từ Django 1.7, bạn có một JsonResponse tiêu chuẩn , đó chính xác là những gì bạn cần:

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

Bạn thậm chí không cần json.dump mảng của bạn.


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)

Và theo quan điểm:

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

15

Dành cho những ai sử dụng Django 1.7+

from django.http import JsonResponse

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

tài liệu chính thức


11

Bạn sẽ muốn sử dụng serializer django để trợ giúp với công cụ 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")

2
Đây là phiên bản ưa thích của tôi, nhưng nhận ra rằng nó chỉ ăn Django QuerySets .
patroqueeet

10

Với các khung nhìn dựa trên lớp Django, bạn có thể viết:

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

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

và với Django-Rest-Framework bạn có thể viết:

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

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

6

Nó rất thuận tiện với Django phiên bản 1.7 trở lên vì bạn có lớp JsonResponse, đây là một lớp con của HttpResponse.

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

Đối với các phiên bản cũ hơn của Django, bạn phải sử dụng một đối tượng 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

Làm cách nào để sử dụng công cụ ứng dụng google với ajax (json)?

Mã Javascript với JQuery:

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

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

4

Đây là phiên bản ưa thích của tôi bằng cách sử dụng chế độ xem dựa trên lớp. Đơn giản chỉ cần phân lớp Chế độ xem cơ bản và ghi đè phương thức 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

Mã Django views.py:

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

Mã 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

Lần đầu tiên nhập cái này:

from django.http import HttpResponse

Nếu bạn đã có JSON:

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

Nếu bạn nhận được JSON từ một yêu cầu HTTP khác:

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


1

Trong Xem sử dụng này:

form.field.errors|striptags

để nhận thông báo xác thực không có html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.