2013-01-12 9 views
8

आप डीजेंगो वेबपैड में JSON डेटा को सुरक्षित रूप से कैसे प्रस्तुत करते हैं?Django टेम्पलेट्स में जेएसओएन के अंदर एचटीएमएल के साथ जेएसओएन का सुरक्षित रूप से उपयोग करना

django में सर्वर पर मैं JSON डेटा उत्पन्न करता हूं और फिर उस JSON डेटा को django टेम्पलेट में प्रस्तुत करता हूं। जेएसओएन में कभी-कभी एचटीएमएल के स्निपेट होते हैं। अधिकांश समय, यह ठीक है, हालांकि </script> टैग जेएसओएन डेटा के अंदर होता है जब यह प्रस्तुत किया जाता है, तो यह आसपास के जावास्क्रिप्ट को नष्ट कर देता है।

उदाहरण के लिए

...

सर्वर पर, अजगर में मैं इस होगा:

template_data = { 
    'my_json' : '[{"my_snippet": "<b>Happy HTML</b>"}]' 
} 
# pass the template data to the django template 
return render_to_response('my_template.html', template_data, context_instance = c) 

और फिर टेम्पलेट में:

<script type="text/javascript"> 
var the_json = {{my_json|safe}}; 
</script> 
... some html ... 

परिणामस्वरूप एचटीएमएल ठीक काम करता है और इस तरह दिखता है:

<script type="text/javascript"> 
var the_json = [{"my_snippet": "<b>Happy HTML</b>"}]; 
</script> 
... some html ... 

हालांकि, आपको समस्याएं आ रही हैं, सर्वर पर, JSON इस तरह दिखता है:

template_data = { 
    'my_json' : '[{"my_snippet": "Bad HTML</script>"}]' 
} 
return render_to_response('my_template.html', template_data, context_instance = c) 

अब, जब यह प्रदान की गई है, आप प्राप्त करेंगे:

<script type="text/javascript"> 
var the_json = [{"my_snippet": "Bad HTML</script>"}]; 
</script> 
... some html ... 

JSON कोड के भीतर समापन स्क्रिप्ट टैग को संपूर्ण स्क्रिप्ट ब्लॉक को बंद करने के रूप में माना जाता है। तब आपकी सभी जावास्क्रिप्ट तोड़ जाएगी।

टेम्पलेट में टेम्पलेट डेटा पास करते समय </script> के लिए एक संभावित समाधान जांचना है, लेकिन मुझे लगता है कि एक बेहतर तरीका है।

+0

आप json के रूप में (AJAX के माध्यम से) यह काम कर सकता है या

अजगर वस्तुओं ग्राहक है कि मैं का उपयोग करने के लिए सीधे प्राप्त करने के लिए एक उपयोगी फिल्टर यह है इसे जावास्क्रिप्ट फ़ाइल के रूप में प्रस्तुत करें (फिर इसे स्क्रिप्ट टैग का उपयोग करके शामिल करें)। – DanielB

उत्तर

14

सुरक्षित रूप से एक स्ट्रिंग के रूप JSON डालने, और फिर इसे

उपयोग escapejs सुरक्षित करने के बजाय पर JSON.parse कहते हैं। यह जावास्क्रिप्ट को आउटपुट के लिए डिज़ाइन किया गया है।

var the_json = '{{my_json|escapejs}}'; 

JavaScript ऑब्जेक्ट आप तो है कि स्ट्रिंग पर JSON.parse कॉल करने की आवश्यकता प्राप्त करने के लिए। सुरक्षा कारणों से यह आपकी स्क्रिप्ट में JSON-एन्कोडिंग डंप करने और इसे सीधे मूल्यांकन करने से हमेशा बेहतर होता है।

@register.filter 
def to_js(value): 
    """ 
    To use a python variable in JS, we call json.dumps to serialize as JSON server-side and reconstruct using 
    JSON.parse. The serialized string must be escaped appropriately before dumping into the client-side code. 
    """ 
    # separators is passed to remove whitespace in output 
    return mark_safe('JSON.parse("%s")' % escapejs(json.dumps(value, separators=(',', ':')))) 

और यह पसंद का उपयोग करें::

var Settings = {{ js_settings|to_js }}; 
+0

यदि आप ऐसा करते हैं तो 'the_json' एक स्ट्रिंग बन जाता है, जावास्क्रिप्ट जेसन ऑब्जेक्ट नहीं। – speedplane

+1

आप 'var the_json = JSON.parse ({{my_json | escapejs}} कर सकते हैं) ' – DanielB

+1

मुझे लगता है कि आपको इसे उद्धृत करने की आवश्यकता है, जैसे: var var_json = JSON.parse (' {{my_json | escapejs}} ') ' – speedplane

संबंधित मुद्दे