天道酬勤,学无止境

django escapejs and simplejson

I'm trying to encode a Python array into json using simplejson.dumps:

In [30]: s1 = ['test', '<script>']

In [31]: simplejson.dumps(s1)
Out[31]: '["test", "<script>"]'

Works fine.

But I want to escape the strings first (using escapejs from Django) before calling simplejson.dumps:

In [35]: s_esc
Out[35]: [u'test', u'\\u003Cscript\\u003E']

In [36]: print simplejson.dumps(s_esc)
["test", "\\u003Cscript\\u003E"]

My problem is: I want the escaped string to be: ["test", "\u003Cscript\u003E"] instead of ["test", "\\u003Cscript\\u003E"]

I can use replace:

In [37]: print simplejson.dumps(s_esc).replace('\\\\', '\\')
["test", "\u003Cscript\u003E"]

But is this a good approach? I just want to escape the strings first before encoding them to json. So there will be no syntax errors when I use them in template.

Thanks. :)

评论

simplejson 2.1.0 and later include a JSONEncoderForHTML encoder that does exactly what you want. To use it in your example:

>>> s1 = ['test', '<script>']
>>> simplejson.dumps(s1, cls=simplejson.encoder.JSONEncoderForHTML)
'["test", "\\u003cscript\\u003e"]'

I ran into this recently where I didn't have control over the code that was generating the data structures, so I couldn't escape the strings as they were being assembled. JSONEncoderForHTML solved the problem neatly at the point of output.

Of course, you'll need to have simplejson 2.1.0 or later. (Django used to come with an older version, and Django 1.5 deprecated django.utils.simplejson entirely.) If you can't upgrade for some reason, the JSONEncoderForHTML code is relatively small and could probably be pulled into earlier code or used with Python 2.6+'s json package -- though I haven't tried this myself

You're doing the operations in the wrong order. You should dump your data to a JSON string, then escape that string. You can do the escaping with the addslashes Django filter.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Django模板变量和Javascript(Django Template Variables and Javascript)
    问题 当我使用Django模板渲染器渲染页面时,我可以传入一个包含各种值的字典变量,以使用{{ myVar }}在页面中对其进行操作。 有没有办法在Javascript中访问相同的变量(也许使用DOM,我不知道Django如何使变量可访问)? 我希望能够基于传入的变量中包含的值使用AJAX查找来查找详细信息。 回答1 {{variable}}被直接替换为HTML。 查看资料; 它不是“变量”或类似的变量。 它只是渲染的文本。 话虽如此,您可以将这种替换形式添加到JavaScript中。 <script type="text/javascript"> var a = "{{someDjangoVariable}}"; </script> 这为您提供了“动态” javascript。 回答2 小心检查票证#17419,以获取有关将类似的标签添加到Django核心中的讨论以及通过将此模板标签与用户生成的数据一起使用而引入的可能的XSS漏洞的讨论。 amacneil的评论讨论了故障单中提出的大多数问题。 我认为最灵活,方便的方法是为要在JS代码中使用的变量定义模板过滤器。 这使您可以确保对数据进行正确的转义,并且可以将其与复杂的数据结构(例如dict和list 。 这就是为什么我写这个答案的原因,尽管有一个公认的答案,但有很多反对意见。 这是模板过滤器的示例: // myapp
  • 通过Django将Python数据传递给JavaScript(Passing Python Data to JavaScript via Django)
    问题 我正在使用Django和Apache来提供网页。 我的JavaScript代码当前包含一个数据对象,该数据对象的值将基于用户从选项菜单中的选择而显示在各种HTML小部件中。 我想从Python字典中导出这些数据。 我想我知道如何将JavaScript代码嵌入HTML中,但是如何(即时)将数据对象嵌入该脚本中,以便脚本的功能可以使用它呢? 换句话说,我想从Python字典创建JavaScript对象或数组,然后将该对象插入JavaScript代码,然后将该JavaScript代码插入HTML。 我认为这种结构(例如,嵌入JavaScript代码中变量中的数据)不是最理想的,但是作为一个新手,我不知道替代方案。 我见过Django序列化功能的文章,但是这些文章对我没有帮助,直到我首先将数据放入我的JavaScript代码中为止。 我(尚未)使用jQuery之类的JavaScript库。 回答1 nb见底部的2018更新 我建议不要在Django模板中放置太多JavaScript-往往很难编写和调试,尤其是在项目扩展时。 相反,请尝试将所有JavaScript写入一个单独的脚本文件中,以供模板加载,并在模板中仅包含JSON数据对象。 这使您可以执行诸如通过JSLint之类运行整个JavaScript应用程序,对其进行缩小等操作,并且可以使用静态HTML文件对其进行测试
  • 使用 Jinja2 为 JavaScript 转义字符串?(Escape strings for JavaScript using Jinja2?)
    问题 如何使用 Jinja2 转义 HTML 以便它可以用作 JavaScript (jQuery) 中的字符串? 如果我使用 Django 的模板系统,我可以这样写: $("#mydiv").append("{{ html_string|escapejs }}"); Django 的 |escapejs 过滤器会转义html_string东西(例如引号、特殊字符),这可能会破坏此代码块的预期用途,但 Jinja2 似乎没有等效的过滤器(我在这里错了吗?)。 有没有比从 Django 复制/粘贴代码更干净的解决方案? 回答1 我去年也遇到过类似的问题。 不确定您是否在使用瓶子,但我的解决方案看起来像这样。 import json def escapejs(val): return json.dumps(str(val)) # *but see [Important Note] below to be safe @app.route('/foo') def foo(): return bottle.jinja2_template('foo', template_settings={'filters': {'escapejs': escapejs}}) (我将template_settings dict 包装在一个辅助函数中,因为我到处都使用它,但在这个例子中我保持简单。) 不幸的是
  • 从 Django 模板中转义 JSON 数据的正确方法(Right way to escape JSON data from django template)
    问题 我想将字典从 django 视图传递到 javascript 文件。 该词典是根据站点用户填充的数据库构建的。 这两种方法在安全性方面有什么区别? var mydata = JSON.parse("{{mydata|escapejs}}"); var mydata = {{ mydata|safe }}; 此外,django 的文档对escapejs说:这不会使字符串在 HTML 中使用安全。 你能告诉我一个例子说明它是如何不安全的以及我如何使它安全。 回答1 对于在 2019 年遇到此问题的任何人,Django 现在通过|json_script模板过滤器提供第三个选项。 此过滤器负责正确序列化和转义 Python 对象以在 HTML 中使用。 从文档中,使用带有不安全字符my_data = {'hello': 'world</script>&'}示例数据: {{ my_data|json_script:"my-data" }} 呈现为 <script id="my-data" type="application/json"> {"hello": "world\\u003C/script\\u003E\\u0026amp;"} </script> 然后,您可以通过 Javascript 访问这些数据 var value = JSON.parse(document
  • Django 模板过滤器 - 一行(Django template filter - one line)
    问题 我正在寻找一个 Django 模板过滤器,它将多行结构变成一条大行。 有没有人实施过? 原因是 - 我有一个表单,{{form.as_p}} 创建了一个多行 html 片段,我想创建一个 javascript 变量,它是一个 html 片段,但是当我这样做时: var new_div_text = '{{form.as_p}}'; 它不起作用。 原因很明显,在 javascript 结构中,如 var hello = 'Hello world'; 无效! 回答1 阅读您的用例,您似乎并不只想删除行。 如果您的表单标签之一包含 ' 字符怎么办? 糟糕,您的 javascript 现在无效。 Django 带有一个名为escapejs的过滤器,我们正是用它来解决这个问题的。 使用escapejs,你可以输入: var newDivText = '{{ form.as_p|escapejs }}' 并且您不必担心任何字符会破坏您的 javascript。
  • django 将数据传递给 javascript 的最佳方式(django best way to pass data to javascript)
    问题 在我发现数据绑定库之前,我曾经将我的数据“绑定”到 DOM。 我的问题是,假设我有一个包含模型记录的表,我如何使用 JS 构建该表,即将对象传递给 javascript 而不是直接在模板中构建表? 到目前为止,我发现的唯一方法是这样的: var data = '{{data}}'; {{data}}可以是这个例子的 json。 将模板代码放在 javascript 中,这对我来说似乎既丑陋又糟糕,而且我也不喜欢在 javascript 中使用全局变量的想法(旧方式,它不能很好地扩展)。 它也不允许我把它放在外部 JS 文件中。 有没有更好(和干净)的方法? 回答1 django 模板自动转义所有标签 {{ }}。 如果 table_data 已经是模板标签中的 json 数据。 简单的。 <script> var myTable = {% autoescape off %}{{ table_data }}{% endautoescape %}; </script> 不需要括号和引号,它是javascript中的数组(例如var example = ['test'];) 如果数据不是 json,则在请求中返回它(渲染模板)。 例子 import json from django.shortcuts import render def home(request): table
  • Django:使用Javascript解析模板中的JSON(Django: Parse JSON in my template using Javascript)
    问题 我认为: string_location = myaddress2 geodata = [] for place, (lat, lng) in g.geocode(string_location,exactly_one=False): geodata.append((place, (lat, lng))) geodata_results = len(geodata) data = {"geodata": geodata, "geodata_results":geodata_results } return render_to_response("business/business_view.html", data, context_instance=RequestContext(request)) 如何将地理数据“处理” /转换为JSON并将其传递到模板,以便像数组一样“循环”通过它? 我认为我可以这样做是对的吗? 如果没有,请提出更好的解决方案。 谢谢! 更新 var geodata = "[["M. L. Quezon Street<br/>Mandaue City, Philippines", [10.351381999999999, 123.923535]], ["Talamban<br/>Cebu City, Philippines", [10.353527
  • 我应该何时在Django的模板系统中使用转义和安全?(When should I use escape and safe in Django's template system?)
    问题 如果我有一个供人们发表评论的框,然后以这种方式显示该评论...我应该逃避吗? {{ c.title }} 回答1 实际上,这取决于。 Django的模板引擎会自动转义,因此您实际上并不需要转义。 如果您添加模板过滤器“ safe”(如{{c.title|safe}}那么您确实需要担心诸如html注入之类的事情,因为“ safe”将字符串标记为字符串,这意味着它不会被转义。 还有一个{%autoescape on%} ... {%endautoescape%}模板标签,如有必要,可以将“ on”更改为“ off”。 默认情况下,它处于启用状态,不需要标签。 默认情况下,其他模板引擎可能不会转义,Jinja2是其中之一。 回答2 HTML自动转义默认情况下处于启用状态,因此在大多数情况下,您无需手动转义,但并非全部! 将变量的内容转储到HTML元素中很好: <p>{{ variable }}</p> Django将自动转义字符< , > , & , "和' ,这是这里需要的。 还可以将变量转储到属性中,因为"和'都被转义了,但是请确保记住不要加引号,因为不会转义空格: <span class="{{ variable }}">...</span> <!-- Good --> <span class={{ variable }}>...</span> <!-- Bad -->
  • How would you make a dynamic formset in Django?
    Here's the way I'm doing it: {{ formset.management_form }} <table> {% for form in formset.forms %} {{ form }} {% endfor %} </table> <a href="javascript:void(0)" id="add_form">Add Form</a> And here's the JS: var form_count = {{formset.total_form_count}}; $('#add_form').click(function() { form_count++; var form = '{{formset.empty_form|escapejs}}'.replace(/__prefix__/g, form_count); $('#forms').append(form) $('#id_form-TOTAL_FORMS').val(form_count); }); What specifically bothers me is that I had to write that escapejs template tag myself. It just strips all newlines and escapes any single quotes
  • django模板标签的未终止字符串文字错误(unterminated string literal error for a django template tag)
    问题 我有以下代码片段,这些代码片段给了我无限的字符串文字错误 $(function() { $('#addDropdown').click(function() { var $d = $('{{ form |bootstrap }}').fadeIn().delay(1000); $('#dropdownContainer').append($d); }); }); 我查看了未终止的字符串文字问题,发现这是因为存在多行问题。我的{{form | bootstrap}}有多行代码,如问题中所述。因此,我该如何处理该问题 回答1 通常,要与JavaScript一起使用,应使用|escapejs过滤器: var $d = $('{{ value|escapejs }}'); 但是,作为最佳实践,您最好将{{ form|bootstrap }}放入HTML中,并使用JavaScript来淡入: <div id="djangoForm" style="display:none">{{ form|bootstrap }}</div> <script> $('#addDropdown').click(function() { $('#dropdownContainer').append($('#djangoForm')); } </script>
  • 无法导入名称simplejson-安装simplejson后(Cannot import name simplejson - After installing simplejson)
    问题 我有Django版本1.7和Python版本2.7.5-我使用pip install simplejson和apt-get install python-simplejson命令来解决此问题,但仍然显示此异常。 Django和Python之间是否存在任何兼容性问题,或者解决该异常的解决方案是什么: Traceback (most recent call last): File "manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "/root/test_env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line utility.execute() File "/root/test_env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute django.setup() File "/root/test_env/local/lib/python2.7/site-packages
  • Right way to escape JSON data from django template
    I want to pass a dictionary from django view to a javascript file. The dictionary is built from a database populated by site users. What's the difference between these 2 methods in terms of security? var mydata = JSON.parse("{{mydata|escapejs}}"); var mydata = {{ mydata|safe }}; Further, the doc at django says this for escapejs : This does not make the string safe for use in HTML. Could you show me an example of how it's unsafe & how can I make it safe.
  • 使用simplejson对JSON模型进行JSON序列化(JSON Serializing Django Models with simplejson)
    问题 我想使用simplejson序列化Django模型。 Django的序列化器不支持字典...,而simplejson不支持Django Querysets。 这是一个难题。 在模型中,有一些赞助商具有“赞助商”级别的外键,我试图将属于某个赞助商级别的所有赞助商归为一组。 这是生成列表的代码: from django.shortcuts import get_list_or_404 from special_event.models import Sponsor, SponsorLevel sponsor_dict = {} roadie_sponsors = get_list_or_404(Sponsor, level__category = SponsorLevel.ROADIE_CHOICE) for item in roadie_sponsors: try: sponsor_dict[item.level.name].append(item) except KeyError: sponsor_dict[item.level.name] = [item] 这是sponsor_dict样子 { 'Fan': [<Sponsor: Fan Sponsor>], 'VIP': [<Sponsor: VIP Sponsor>], 'Groupie': [<Sponsor
  • Cannot import name simplejson - After installing simplejson
    I have Django Version 1.7 and Python Version 2.7.5 - I used pip install simplejson and apt-get install python-simplejson commands to solve this problem but it still shows me this exception. Is there any compatibility issue between Django and Python or what is the solution to get out of this exception: Traceback (most recent call last): File "manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "/root/test_env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line utility.execute() File "/root/test_env/local/lib/python2
  • 如何在javascript中使用从Django传递过来的上下文变量?(How to use the context variables passed from Django in javascript?)
    问题 我在 views.py 中有一个方法如下: def index(self, request): initial = get_initial() context = {"context" : initial_topics} template = loader.get_template('index.html') return HttpResponse(template.render(context, request)) 如何访问 javascript 中的“上下文”字典? 就像我的 $(function(){}); 回答1 您可以访问 HTML script标签内的上下文变量。 尽管如此,一些规则仍然适用: 如果上下文变量是字符串,请用引号将上下文变量括起来。 如果上下文变量是字典或列表,请不要使用引号。 但使用safe过滤器。 例子: <script> $(function(){ var my_str = "{{ my_str }}"; var my_dict = {{ my_dict|safe }}; var my_list = {{ my_list|safe }}; }); </script> 从上面的示例中,您可以看到您可以按原样访问 Python dict 或列表,而无需转换为 json。 但它可能会导致一些错误。 例如,如果您的 dict
  • 您将如何在Django中创建动态表单集?(How would you make a dynamic formset in Django?)
    问题 这是我的操作方式: {{ formset.management_form }} <table> {% for form in formset.forms %} {{ form }} {% endfor %} </table> <a href="javascript:void(0)" id="add_form">Add Form</a> 这是JS: var form_count = {{formset.total_form_count}}; $('#add_form').click(function() { form_count++; var form = '{{formset.empty_form|escapejs}}'.replace(/__prefix__/g, form_count); $('#forms').append(form) $('#id_form-TOTAL_FORMS').val(form_count); }); 特别令我困扰的是,我不得不自己编写那个escapejs模板标签。 它只是去除所有换行符并转义任何单引号,以免弄乱我的字符串。 但是在这种情况下,Django制造商究竟期望我们做什么? 当他们本可以使用像<input name="my_form_field[0]" />这样的数组然后计算其长度时,为什么TOTAL_FORMS拥有这个TOTAL
  • JSON Serializing Django Models with simplejson
    I'd like to use simplejson to serialize a Django model. Django's serializer doesn't support dictionaries... and simplejson doesn't support Django Querysets. This is quite a conundrum. In the model there's sponsors that have a Foreign Key to sponsor level, I'm trying to group all the sponsors that belong to a certain sponsor level together. Here's the code that generates the list: from django.shortcuts import get_list_or_404 from special_event.models import Sponsor, SponsorLevel sponsor_dict = {} roadie_sponsors = get_list_or_404(Sponsor, level__category = SponsorLevel.ROADIE_CHOICE) for item
  • Escape strings for JavaScript using Jinja2?
    How do I escape HTML with Jinja2 so that it can be used as a string in JavaScript (jQuery)? If I were using Django's templating system I could write: $("#mydiv").append("{{ html_string|escapejs }}"); Django's |escapejs filter would escape things in html_string (eg quotes, special chars) that could break the intended use of this code block, but Jinja2 does not seem to have an equivalent filter (am I wrong here?). Is there a cleaner solution than copying/pasting the code from Django?
  • 通过url获取json数据并在python中使用(simplejson)(Get json data via url and use in python (simplejson))
    问题 我想这一定有一个简单的答案,但我很挣扎:我想获取一个 url(输出 json)并在 python 中的可用字典中获取数据。 我卡在最后一步了。 >>> import urllib2 >>> import simplejson >>> req = urllib2.Request("http://vimeo.com/api/v2/video/38356.json", None, {'user-agent':'syncstream/vimeo'}) >>> opener = urllib2.build_opener() >>> f = opener.open(req) >>> f.read() # this works '[{"id":"38356","title":"Forgetfulness - Billy Collins Animated Poetry","description":"US Poet Laureate Billy Collins reads his poem ","url":"http:\\/\\/vimeo.com\\/38356","upload_date":"2006-01-24 15:21:03","thumbnail_small":"http:\\/\\/80.media.vimeo.com\\/d1\\/5\\/47\\/74\\
  • 在 Django 中处理 JSON 的最佳方式(best way to deal with JSON in django)
    问题 我从服务器获取 JSON 提要,今天我将它转换为 python 对象,从而转换为 django 视图。 我们现在正在更新我们的网站。 由此 浏览器客户端应该使用 jQuery 解析 json 我们还将有一个 adobe-air 应用程序,它将直接使用 JSON 但是我不太热衷于将我的后端服务器直接暴露给浏览器/adobe 客户端。 通过 django 的最佳方式是什么? 任何现有的 Django 应用程序? 问候 Django 新手 回答1 您可以使用 Django 的某些内置元素,但我一直发现 SimpleJSON 使事情变得更容易。 为什么? 使用直接序列化,您不想显示所有内容。 因此,使用内置方法,您必须削减很多。 使用 SimpleJSON,您构建了一个 dict,仅用您想要显示的内容填充它并通过 SimpleJSON 库将其抽取。 在公开 API 时,我发现包含比排除更安全。 它在使用数据方面也更加通用,因为您的客户端不会是 django 站点,它是一个 AIR 应用程序,对如何格式化数据有自己的想法(即使在像 JSON 这样的规范中,也可能会有差异) . 哦,请记住,JSON 中没有日期类型。 (我提它只是因为它过去让我痛苦) 编辑:(感谢 Cide)Django 在django.utils.simplejson中提供django.utils