मैं Jango को Django में टेम्पलेट का उपयोग किए बिना कैसे वापस करूं?


82

यह इस प्रश्न से संबंधित है: ग्राहक पाइथन के आधार पर Django वापसी json और html


मेरे पास एक Django ऐप के लिए एक कमांड लाइन पायथन एपीआई है। जब मैं एपीआई के माध्यम से एप्लिकेशन का उपयोग करता हूं तो उसे JSON को वापस करना चाहिए और एक ब्राउज़र के साथ इसे HTML वापस करना चाहिए। मैं अलग-अलग संस्करणों तक पहुंचने के लिए अलग-अलग URL का उपयोग कर सकता हूं लेकिन मैं HTML टेम्पलेट और JSON को केवल एक ही टेम्पलेट के साथ view.py में कैसे प्रस्तुत कर सकता हूं ?

HTML का उपयोग करने के लिए मैं उपयोग करूंगा:

return render_to_response('sample/sample.html....')

लेकिन JSON टेम्पलेट लगाए बिना मैं JSON के लिए समान कैसे करूंगा? ( इसके बजाय content-typeहोना चाहिए )application/jsontext/html

JSON और HTML आउटपुट क्या निर्धारित करेगा?

तो मेरे विचारों में :

if something:
    return render_to_response('html_template',.....)
else:
    return HttpReponse(jsondata,mimetype='application/json')

@ मारकिन आपने मूल रूप से उसे "नहीं, इस तरह से मत करो" उसे सही तरीके का उदाहरण दिखाए बिना किया। यही कारण है कि यह एक के लिए लगता है ...
इज़काता

@ जिमी, अगर ऐसा हुआ है, तो आपको अन्य प्रश्नों पर मार्सिन के उत्तर को इतनी जल्दी स्वीकार नहीं करना चाहिए था। कम से कम एक दिन प्रतीक्षा करें, किसी व्यक्ति ने उकु लॉसकिट के उत्तर की तरह कुछ के साथ उत्तर दिया होगा
इज़्काटा

@ इज़काटा: मैंने वास्तव में उसे बताया था कि किस पुस्तकालय का उपयोग करना है। यह प्रश्न किसी अन्य व्यक्ति को उसके लिए अपना कोड लिखने के उद्देश्य से प्रतीत होता है।
मार्सिन

जवाबों:


134

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

सबसे पहले, आपको दोनों के बीच मुख्य अंतर को समझने की जरूरत है। HTML एक प्रस्तुतिकरण प्रारूप है। यह डेटा की तुलना में डेटा को प्रदर्शित करने के तरीके से अधिक संबंधित है। JSON विपरीत है। यह शुद्ध डेटा है - मूल रूप से आपके पास कुछ पायथन (इस मामले में) डेटासेट का जावास्क्रिप्ट प्रतिनिधित्व है। यह केवल एक इंटरचेंज परत के रूप में कार्य करता है, जिससे आप अपने ऐप के एक क्षेत्र (दृश्य) से अपने ऐप के दूसरे क्षेत्र (आपके जावास्क्रिप्ट) पर डेटा स्थानांतरित कर सकते हैं, जो आम तौर पर एक-दूसरे तक नहीं पहुंचते हैं।

ध्यान में रखते हुए, आप JSON को "रेंडर" नहीं करते हैं, और इसमें कोई टेम्पलेट शामिल नहीं है। आप केवल जो भी डेटा प्ले में कनवर्ट करते हैं (सबसे ज्यादा संभावना है कि जो आप अपने टेम्पलेट के संदर्भ में गुजर रहे हैं)। जो कि Django के JSON लाइब्रेरी (सिंपलजसन) के माध्यम से किया जा सकता है, अगर यह फ्रीफ़ॉर्म डेटा है, या इसका क्रमांकन ढांचा है, अगर यह एक क्वेरीसेट है।

सिंपलसन

from django.utils import simplejson

some_data_to_dump = {
   'some_var_1': 'foo',
   'some_var_2': 'bar',
}

data = simplejson.dumps(some_data_to_dump)

क्रमबद्धता

from django.core import serializers

foos = Foo.objects.all()

data = serializers.serialize('json', foos)

किसी भी तरह से, आप फिर उस डेटा को प्रतिक्रिया में पास करते हैं:

return HttpResponse(data, content_type='application/json')

[संपादित करें] Django 1.6 और पहले में, प्रतिक्रिया वापस करने के लिए कोड था

return HttpResponse(data, mimetype='application/json')

[EDIT]: सिंपलसन को django से हटा दिया गया था , आप इसका उपयोग कर सकते हैं:

import json

json.dumps({"foo": "bar"})

या आप django.core.serializersऊपर वर्णित के रूप में उपयोग कर सकते हैं ।


स्पष्टीकरण के लिए धन्यवाद। मैं अपने विचारों में कैसे निर्धारित करता हूं कि प्रतिक्रिया अनुरोध जोंस के लिए एपीआई द्वारा है? प्रश्न पर संपादित देखें।
नीरान

1
आप उपयोग कर सकते हैं request.is_ajax()। लेकिन इसके लिए जरूरी है कि HTTP_X_REQUESTED_WITHहेडर सेट हो। अधिकांश जावास्क्रिप्ट लाइब्रेरी स्वचालित रूप से ऐसा करते हैं, लेकिन यदि आप किसी अन्य प्रकार के क्लाइंट का उपयोग कर रहे हैं, तो आपको यह सुनिश्चित करने की आवश्यकता होगी कि यह इसे भी सेट करता है। वैकल्पिक रूप से, आप ?jsonURL के साथ एक querystring पास कर सकते हैं और फिर जांच कर सकते हैं request.GET.has_key('json'), जो शायद थोड़ा अधिक मूर्ख है।
क्रिस प्रैट

18
ध्यान दें कि simplejson अब Django 1.5 द्वारा पदावनत माना जाता है । import json ; json.dumps(data)इसके बजाय उपयोग करें ।
योनातन

1
ओपी को requestऑब्जेक्ट में "स्वीकार" सामग्री प्रकार बातचीत हेडर की जांच करनी चाहिए । देखें: w3.org/Protocols/rfc2616/rfc2616-sec14.html (रीड का बड़ा मैमथ, लेकिन एक सरलीकृत कोड सैंपल का उपयोग किया जा सकता है, और इसे प्रदर्शित करना बहुत कठिन काम नहीं होगा। दो मामलों को वे पूछ रहे हैं)
मेरलिन मॉर्गन-ग्राहम

14
मेरे मामले में (Django 1.7) यह content_type = 'application / json' था,
mimetype


8

JSON प्रतिक्रिया के मामले में प्रदान किए जाने वाला कोई टेम्पलेट नहीं है। टेम्पलेट HTML प्रतिक्रियाओं को उत्पन्न करने के लिए हैं। JSON HTTP प्रतिक्रिया है।

हालाँकि, आपके पास HTML हो सकता है जो आपके JSON प्रतिक्रिया के साथ टेम्पलेट से प्रदान किया गया हो।

html = render_to_string("some.html", some_dictionary)
serialized_data = simplejson.dumps({"html": html})
return HttpResponse(serialized_data, mimetype="application/json")

क्या मुझे पहले वस्तुओं को क्रमबद्ध करना है?
नीरन

simplejson.dumps () क्रमांकन क्या करता है।
उकु लोसकिट

धन्यवाद इसके ठीक काम करने के लिए। हम सिंपलसन @UkuLoskit के बजाय जोंस का भी उपयोग कर सकते हैं
चिराग कंजरिया

7

ऐसा लगता है कि Django REST फ्रेमवर्क अनुरोध को स्वीकार करने के लिए HTTP रेकॉर्डर का उपयोग करता है ताकि यह निर्धारित किया जा सके कि कौन सा रेंडरर उपयोग करना है:

http://www.django-rest-framework.org/api-guide/renderers/

HTTP स्वीकार हेडर का उपयोग करने से आपके "यदि कुछ है" के लिए एक वैकल्पिक स्रोत उपलब्ध हो सकता है।


7

अपने मॉडल को JSON में django 1.9 में प्रस्तुत करने के लिए मुझे अपने विचारों में निम्नलिखित करना होगा:

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

def index(request):
    objs = Mymodel.objects.all()
    jsondata = serializers.serialize('json', objs)
    return HttpResponse(jsondata, content_type='application/json')

आप
MichielB

2

आप rfc में निर्दिष्ट अनुरोध प्रकार को भी स्वीकार कर सकते हैं। इस तरह से आप डिफ़ॉल्ट एचटीएमएल द्वारा प्रस्तुत कर सकते हैं और जहां आपका ग्राहक आवेदन स्वीकार करता है / जेसन आप अपनी प्रतिक्रिया में जेन्स वापस कर सकते हैं बिना किसी टेम्पलेट की आवश्यकता के


2
from django.utils import simplejson 
from django.core import serializers 

def pagina_json(request): 
   misdatos = misdatos.objects.all()
   data = serializers.serialize('json', misdatos) 
   return HttpResponse(data, mimetype='application/json')

1

अनुरोध के Acceptहेडर के आधार पर सशर्त रेंडरिंग json या html के लिए मुझे एक उदाहरण की आवश्यकता है

# myapp/views.py
from django.core import serializers                                                                                
from django.http import HttpResponse                                                                                  
from django.shortcuts import render                                                                                   
from .models import Event

def event_index(request):                                                                                             
    event_list = Event.objects.all()                                                                                  
    if request.META['HTTP_ACCEPT'] == 'application/json':                                                             
        response = serializers.serialize('json', event_list)                                                          
        return HttpResponse(response, content_type='application/json')                                                
    else:                                                                                                             
        context = {'event_list': event_list}                                                                          
        return render(request, 'polls/event_list.html', context)

आप इसे कर्ल या httpie के साथ टेस्ट कर सकते हैं

$ http localhost:8000/event/
$ http localhost:8000/event/ Accept:application/json

ध्यान दें कि मैंने उपयोग नहीं करने का विकल्प चुना है जो मॉडल को अनावश्यक रूप से पुन: व्यवस्थितJsonReponse करेगा ।


0

यदि आप परिणाम को प्रदान किए गए टेम्प्लेट के रूप में पास करना चाहते हैं, तो आपको एक टेम्प्लेट को लोड और रेंडर करना होगा, इसे रेंडर करने के लिए पास करें। यह इस तरह दिख सकता है:

from django.template import loader, RequestContext

#render the template
t=loader.get_template('sample/sample.html')
context=RequestContext()
html=t.render(context)

#create the json
result={'html_result':html)
json = simplejson.dumps(result)

return HttpResponse(json)

इस तरह आप एक रेंडर टेम्पलेट को अपने क्लाइंट को json के रूप में दे सकते हैं। यदि आप पूरी तरह से प्रतिस्थापित करना चाहते हैं तो यह उपयोगी हो सकता है। विभिन्न तत्वों के एक बहुत से युक्त।


1
एक साइड नोट के रूप में, render_to_string3 "टेम्पलेट रेंडर" लाइनों के लिए एक शॉर्टकट है, और Django 1.0 के बाद से अस्तित्व में है
इज़काता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.