`
panlw
  • 浏览: 53218 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

django的转义总结

阅读更多

初次接触django的开发者,犯的一个常见错误就是转义。

何谓转义?就是把html语言的关键字过滤掉。例如,<div>就是html的关键字,如果要在html页面上呈现<div>,其源代码就必须是&lt;div&gt;

默认情况下,django自动为开发者提供escape功能,即在html代码render之前,先进行转义,然后再呈现出来。这样的话,我们如果想输出一个链接,被转义之后,可能就无法得到我们想要的结果。

例如,下面的method,如果用户是匿名用户,则输出“匿名用户”,否则,输出一个链接,指向用户的profile:

 def get_username(self):

       return “<a href=’/accounts/%s/’>%s</a>” %(self.user.id, self.user.username)

 

在template文件中,如果这样使用上面的方法:

{{topic.get_username}}

这样,输出的结果不是一个链接,而是上面链接转义后的原文。我们无法得到我们想要的结果。

 

有以下几种方法解决自动转义的问题:

1、filter中

修改filter函数的is_safe属性:

@register.filter

def myfilter(value):

    return value

myfilter.is_safe = True

如果你需要更复杂一些,可以亲自来处理escape属性。

首先,设置filter的need_autoesacpe属性为True(默认为False),这个参数告诉django,该filter需要一个传递一个autoesacape的参数,标示是否需要进行转义处理,如果为True,则转义,反之则反。完整的例子如下:

 

from django.utils.html import conditional_escape

from django.utils.safestring import mark_safe

 

def initial_letter_filter(text, autoescape=None):

    first, other = text[0], text[1:]

    if autoescape:

        esc = conditional_escape

    else:

        esc = lambda x: x

    result = ‘<strong>%s</strong>%s’ % (esc(first), esc(other))

    return mark_safe(result)

initial_letter_filter.needs_autoescape = True

 

 

2、template中

去掉template中的自动转义可以使用filter safe,也可以使用auotescape标签,还可以修改render的autoescape属性。

使用safe filter:

This will be escaped: {{ data }}

This will not be escaped: {{ data|safe }}

 

使用autoescape标签:

Auto-escaping is on by default. Hello {{ name }}

 

{% autoescape off %}

    This will not be auto-escaped: {{ data }}.

 

    Nor this: {{ other_data }}

    {% autoescape on %}

        Auto-escaping applies again: {{ name }}

    {% endautoescape %}

{% endautoescape %}

如果在autoescape的标签中include 其他的tags,autoescape的属性将被子tags继承。

 

修改Context类的autoescape属性:

def render(self, context):

    # …

       new_context = Context({‘var’: obj}, autoescape=context.autoescape)

 

注:autoescape标签的优先级高于Context类的autoescape属性,即如果Context中autoescape设置与模板中autoescape标签冲突,则使用autoescape标签的autoescape设置值。

 

>>> from django import template

>>> H=’{% autoescape off %}{{div}}{% endautoescape %}’

>>> c = template.Context({’div’:”<div>”}, autoescape=True)

>>> template.Template(H).render(c)

u’<div>’

>>>

>>> H=’{% autoescape on %}{{div}}{% endautoescape %}’

>>> c = template.Context({’div’:”<div>”}, autoescape=True)

>>> template.Template(H).render(c)

u’&lt;div&gt;’

>>> H=’{% autoescape on %}{{div}}{% endautoescape %}’

>>> c = template.Context({’div’:”<div>”}, autoescape=False)

>>> template.Template(H).render(c)

u’&lt;div&gt;’

>>>

 

3、使用方法函数mark_safe

使用mark_safe函数标记后,django将不再对该函数的内容进行转义,上面的get_username可以修改为:

from django.utils.safestring import mark_safe

def get_username(self):

       return mark_safe(”<a href=’/accounts/%s/’>%s</a>” %(self.user.id, self.user.username))


分享到:
评论

相关推荐

    django 模版关闭转义方式

    关闭django转义的方法有如下两种: 1.关闭单个模版变量的转义: 利用”|safe” 过滤器告诉django这个变量不需要转义, 如模版中:{{ data|sage }} 2.利用django模版标记关闭html或js块转义 {% autoescape off %} ...

    Django上使用数据可视化利器Bokeh解析

    总结来说,Django结合Bokeh提供了一种高效且灵活的方式,可以在Web应用中实现复杂的数据可视化。通过Python编写后端逻辑,利用Bokeh的强大功能生成交互式图表,最后将其嵌入Django模板,用户就能在浏览器中体验到...

    django实现用户的登录注册连接后台数据库完成主页的搭建

    Django提供了诸如`{{ value|escape }}`的过滤器来自动转义HTML,以及`form.is_valid()`来确保表单数据的安全性。 通过以上步骤,我们可以构建一个功能完善的用户登录注册系统,结合Django的强大功能和丰富的生态...

    Django速查卡

    在模板标签中,`{% autoescape on|off %}` 可以控制模板是否自动转义变量内容,防止跨站脚本攻击(XSS)。`{% block %}`、`{% endblock %}`可以定义模板中的可替换块。`{% cycle %}`标签用于在模板中循环切换不同的...

    Django Book中文版

    3. **XSS防护**:Django的模板系统默认对输出内容进行转义,防止跨站脚本攻击。 4. **SQL注入防御**:ORM层自动处理SQL语句的参数化,防止恶意SQL注入。 **Django的其他特性** 1. **管理后台(Admin)**:Django...

    Django Web开发指南 python

    3. **XSS防护**:Django的模板系统自动对输出进行转义,防止跨站脚本攻击。 4. **SQL注入防护**:通过使用ORM(对象关系映射),Django自动处理SQL语句,避免直接拼接字符串导致的SQL注入漏洞。 **Django的扩展性...

    django项目添加了fckeditor

    总结,本文详细介绍了如何在Django项目中集成FCKeditor,从安装、配置到在模型和模板中的使用,以及可能的扩展和自定义。通过这些步骤,你可以为Django后台提供一个功能强大的富文本编辑界面,提升用户的编辑体验。...

    django实现HttpResponse返回json数据为中文

    ### Django 实现 HttpResponse 返回 JSON 数据为中文 #### 背景与问题介绍 在使用 Django 框架开发 Web 应用程序时,经常会遇到需要通过 API 接口返回 JSON 数据的需求。对于国际化应用而言,支持多语言尤其是中文...

    Django框架实现简单电影小网站

    Django提供了一些内置的防护机制,如自动转义HTML,使用CSRF令牌等。 以上是构建这个电影小网站所需的关键知识点。通过这个项目,你可以深入了解Django框架的使用,同时掌握Web开发的基本流程和安全实践。

    基于django的人脸检测Web平台搭建(基于Opencv,自测可用)

    Django提供了许多内置的安全功能,如CSRF保护和自动转义HTML内容,但开发者仍需确保正确配置和使用。 8. **部署与测试**:完成开发后,需要将应用部署到服务器上,常见的选择有Apache、Nginx等。同时,进行充分的...

    Django绝对简明教程.pdf

    根据给定的文件信息,以下是从“Django绝对简明教程.pdf”中提炼出的关键知识点,涵盖的内容包括Django框架的基础概念、视图处理、URL配置、模板使用、过滤器应用以及模型数据库操作。 ### Django框架简介 Django...

    django教程

    ### Django 教程详解 #### 一、Django 框架概述 Django 是一个高级的 Python Web 开发框架,旨在鼓励快速开发并遵循 DRY(Don't Repeat Yourself)原则。它内置了许多功能,包括认证、管理界面、缓存框架、ORM...

    Django绝对简明教程

    - **escape/linebreaks**: 转义HTML标记或转换换行符为` `标签。 - **addslashed**: 在字符串中的引号前后添加斜杠。 - **length**: 返回序列的长度。 #### 七、Model数据库 - **功能**: Django的ORM(对象...

    Django绝对简明手册.doc

    Django绝对简明手册是一个关于Django框架的详细指南,旨在帮助开发者快速理解和掌握Django的基本概念和使用方法。Django是一个用Python编写的开源Web应用框架,它遵循模型-视图-控制器(MVC)架构模式,强调“约定...

    Django与JS交互的示例代码

    在HTML模板中,`|safe`过滤器告诉Django不要对传递的数据进行HTML转义,因为这里的数据是用于JavaScript而不是直接显示在页面上。 对于JavaScript处理接收到的数据,有多种遍历和访问数组和对象的方法。例如,在...

    Python-非官方安全后端Django

    1. **防止跨站脚本攻击(XSS)**:Django的模板系统具有自动转义机制,有效防止恶意代码注入。 2. **防止跨站请求伪造(CSRF)**:Django提供CSRF保护,确保只有来自信任源的表单提交才会被处理。 3. **密码哈希和...

    《轻量级Django》Julia_Elman_,P218_ --高清带目录

    它默认包含了跨站请求伪造(CSRF)保护和输出转义等重要的安全措施。Django还支持SSL和TLS协议,并且可以通过中间件配置来增强安全性。 Django还支持国际化和本地化,能够处理多语言的网站。开发者可以为不同的语言...

    Django博客_博客_django_preventjsv_

    Django提供了一些内置的安全措施,如自动转义HTML,以及使用安全的模板标签和过滤器。我们还需要在处理用户输入时进行验证和清理,确保数据安全。 7. **其他功能**:除了基本的博客功能,描述中还提到了天气显示。...

    python django

    {% filter escape|lower %}文本将被 HTML-转义, 并且全部转化为小写{% endfilter %} ``` firstof: 输出传递给它的第一个不是 False 的变量值 firstof 标签用于输出传递给它的第一个不是 False 的变量值。如果所有...

Global site tag (gtag.js) - Google Analytics