javascriptjsonpyramidzopechameleon

How can I insert JSON into a script tage in a zope chameleon template?


I am building a pyramid/python app where my view callable for a certain template passes in a value called data. This variable is an array in the form of [[[x1,y1,z1,],...],[[v1,v2,v3],...]]

in my viewcallable I have

import json

jsdata = json.dumps(data)

I want to put it into a javascript script tag section of my template so:

<script>
data=${jsdata}
</script>

but i'm pretty sure that syntax is incorrect. How can I do this?

Edit: from this: http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/templates.html it seems that Genshi style replacements are the way to go, which I take to mean that what I have above is correct. I am still unsure however, about whether this should be treated differently because it is going inside a javascript tag. Is this true?


Solution

  • You want to insert a JavaScript array, not a Python list.

    The easiest way to convert between Python and JavaScript formats is to use the json module. JSON is a JavaScript subset for data after all:

    import json
    
    jsdata = (json.dumps(data)
                .replace(u'<', u'\\u003c')
                .replace(u'>', u'\\u003e')
                .replace(u'&', u'\\u0026')
                .replace(u"'", u'\\u0027'))
    

    then pass jsdata to your template instead. The str.replace() calls ensure that the data remains HTML safe.

    In the template, interpolate this without escaping:

    <script>
    var data = ${structure:jsdata};
    </script>