Django और पायथन का उपयोग करके एक JSON प्रतिक्रिया बनाना


452

मैं एक सर्वर साइड अजाक्स प्रतिक्रिया स्क्रिप्ट को Django HttpResponse में बदलने की कोशिश कर रहा हूं, लेकिन जाहिर है यह काम नहीं कर रहा है।

यह सर्वर-साइड स्क्रिप्ट है:

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

और यह परिवर्तित कोड है

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

मैं पायथन लिस्ट को एनकोड करने के लिए सिम्पलसन का उपयोग कर रहा हूं (इसलिए यह JSON सरणी लौटाएगा)। मैं अभी तक समस्या का पता नहीं लगा सका। लेकिन मुझे लगता है कि मैंने think गूंज ’के बारे में कुछ गलत किया।


तुम भी django- कष्टप्रद दृश्य डेकोरेटर का उपयोग कर सकते हैं @ajax_request
zopieux

जवाबों:


917

मैं आमतौर पर एक शब्दकोश का उपयोग करता हूं, JSON सामग्री को वापस करने के लिए सूची नहीं।

import json

from django.http import HttpResponse

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

Pre-Django 1.7 आप इसे इस तरह वापस करेंगे:

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

Django 1.7+ के लिए, JsonResponseजैसा कि इस SO उत्तर में दिखाया गया है , उसका उपयोग करें:

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

4
यह है माइम प्रकार, नहीं सूची है कि उसे मुसीबत में हो रही किया जाना चाहिए। जबकि अधिकांश JSON आमतौर पर शीर्ष स्तर पर एक वस्तु ("शब्दकोश") है, JSON शीर्ष स्तर पर एक सरणी के साथ पूरी तरह से खुश है।
थानाटोस

6
क्षमा करें, यह स्पष्ट नहीं है कि मैंने क्या लिखा है, लेकिन मेरा मतलब केवल यह था कि मैं एक शब्दकोश का उपयोग करता हूं क्योंकि यह JSON को क्रमबद्ध करते समय क्लीनर / आसान है।
टॉम

IE के पुराने संस्करणों में 'एप्लिकेशन / जसन' का ठीक से समर्थन नहीं किया गया है। यहाँ इस मुद्दे की कुछ चर्चा है github.com/blueimp/jQuery-File-Upload/issues/123
विक्ट्री

161

Django में नया 1.7

आप JsonResponse वस्तुओं का उपयोग कर सकते हैं ।

डॉक्स से:

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

2
एक नकारात्मक पक्ष: यह चूक करता है ensure_asciiऔर मुझे इसे ओवरराइड करने का कोई तरीका नहीं मिला। इसके लिए एक नया प्रश्न बनाया गया: stackoverflow.com/q/34798703/854477
int_ua

@int_ua: सिर्फ ऐड json_dumps_params={"ensure_ascii": False}(Django 1.9 या उच्चतर की आवश्यकता होती)
मार्टिन पीटर्स

139

मैं इसका उपयोग करता हूं, यह ठीक काम करता है।

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

वैकल्पिक:

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

Django में 1.7 JsonResponse वस्तुओं को Django ढांचे में जोड़ा गया है जो इस कार्य को और भी आसान बनाता है:

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

1
समस्या यह है कि इसे इनपुट फ़ील्ड vld_value = request.POST.get ('validateValue') से मान नहीं मिल रहा है
स्विच

2
अजगर 2.7 के साथ, यह सिर्फ "आयात जोंस" होना चाहिए
कलन शराबी जेनिंग्स

1
मुझे लगता from django.utils import simplejsonहै कि पश्चगामी अनुकूलता के लिए है।
स्काईलार सावलैंड

JsonResponse(status=404, data={'status':'false','message':message})
बेल्टर

25

Django 1.7 के बाद से आपके पास एक मानक JsonResponse है जो वास्तव में आपकी आवश्यकता है:

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

आपको अपने सरणी को json.dump करने की भी आवश्यकता नहीं है।


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)

और देखने में:

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


11

आप यूनिकोड सामान की सहायता के लिए django serializer का उपयोग करना चाहते हैं:

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
यह मेरा पसंदीदा संस्करण था, लेकिन एहसास हुआ कि यह केवल Django QuerySets खाता है
patroqueeet

10

Django क्लास-आधारित विचारों के साथ आप लिख सकते हैं:

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

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

और Django- रेस्ट-फ्रेमवर्क के साथ आप लिख सकते हैं:

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

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

6

Django संस्करण 1.7 या उच्चतर के साथ इसका बहुत सुविधाजनक है क्योंकि आपके पास JsonResponse वर्ग है, जो HttpResponse का उपवर्ग है।

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

Django के पुराने संस्करणों के लिए, आपको एक 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

Ajax (json) के साथ Google ऐप इंजन का उपयोग कैसे करें?

कोड जावास्क्रिप्ट के साथ जावास्क्रिप्ट:

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

कोड पायथन

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

वर्ग आधारित दृश्य का उपयोग करके यह मेरा पसंदीदा संस्करण है। बस मूल दृश्य को उप-वर्ग करें और प्राप्त () विधि को ओवरराइड करें।

import json

class MyJsonView(View):

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

4

Django कोड views.py:

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

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

पहले इसे आयात करें:

from django.http import HttpResponse

यदि आपके पास JSON पहले से है:

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

यदि आपको एक और HTTP अनुरोध से JSON मिलता है:

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


1

दृश्य में इसका उपयोग करें:

form.field.errors|striptags

html के बिना सत्यापन संदेश प्राप्त करने के लिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.