`
panlw
  • 浏览: 52268 次
  • 性别: 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实现模板中的字符串文字和自动转义

    模板中的字符串文字不会自动转义,因为这里默认模板的作者已经正确书写模板的内容。 {{ data|default:”This is a string literal.” }} 如果我们在data不存在时,显示默认文字“3 &lt; 2”,则代码如下: {{ data...

    Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】

    主要介绍了Django框架模板语言,结合实例形式总结分析了Django框架中变量,标签,过滤器,继承,html转义等相关模板语言操作技巧,需要的朋友可以参考下

    django模板获取list中指定索引的值方式

    查了老半天才知道是django的自动转义搞的鬼! 那什么是转义呢,就是把html语言的关键字过滤掉。例如, 就是html的关键字,如果要在html页面上呈现, 其源代码就必须是 标题默认情况下,django自动为开发者提供escape...

    django输出html内容的实例

    最近在学习django,于是就用django做了一个简单的网站,用来练手,具体功能就是从网上抓取...对于单个变量使用django的过滤器,告诉Django这个字符串不用进行HTML转义,方法如下: data | safe 对于一段模板内容可以

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    JavaScript序列化及转义 开小差之自动登录抽屉并点赞 eval以及时间操作 JavaScript作用域 JavaScript面向对象及原型 Dom选择器以及内容文本操作 Dom样式操作 Dom属性及创建标签 Dom提交表单及其他 Dom事件操作 Dom...

    Python全栈之Django开发

    学习python后端框架Django,学习,模型分析、模型创建、模型迁移、模型查询等操作,Request、Response、Cookie、Session等,模板语言、过滤器、转义等.

    手把手带你学会Django2.0框架

    本课程是基于Python3.8和Django2.1.5框架进行讲解,主要内容有:1、模型模块学习内容大概是:模型分析、模型创建、模型迁移、模型查询等操作2、视图模块学习内容大概是:Request、Response、Cookie、Session等3、模板...

    django-simple-mail:交易电子邮件在 Django 中变得简单

    2.2.6 禁用邮件主题自动转义 2.2.5从删除未使用的参数send_mass_mail的方法BaseSimpleMail 2.2.4添加send_mass_mail方法BaseSimpleMail 2.2.3 从管理员中删除操作(我们没有删除权限) 2.2.2 添加 Django 1.9 和 ...

    Django 过滤器汇总及自定义过滤器使用详解

    Django 过滤器 过滤器 描述 示例 upper 以大写方式输出 {{ user.name | upper }} add 给value加上一个数值 {{ user.age | add:”5” }} addslashes 单引号加上转义号   capfirst 第一个字母大写 {{ ...

    Django Template 4.模板语法标签DTL

    模板语法DTL变量标签{{}}块标签{%%}遍历列表:正逆循环、正逆编号遍历字典:多个参数empty无记录csrf_tokenautoescape自动转义开启关闭注释 DTL django template language 模板语法,也就是之前在html写的django语言...

    Falsk 与 Django 过滤器的使用与区别详解

    -- safe过滤器,可以禁用转义 --&gt; {{'&lt;strong&gt;hello&lt;/strong&gt;'|safe}} 大写转小写 {{'HELLO'|lower}} 小写转大写 {{'hello'|upper}} 字符串反转 {{'abc'|reverse}} 首字母大写 {{'james'|...

    django中模板的html自动转意方法

    今天小编就为大家分享一篇django中模板的html自动转意方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    medotcom-2014:这是我在 Django 的个人网站(2014-2016)

    用 Django 构建,背景是水星和惠特尼。 。 当前版本:1.3 新的功能: 改进了移动主页上“最新帖子”的外观 修复了博客文章中新元素的 Markdown Deux HTML 转义 现在可以在博客文章中包含表格 全尺寸帖子图片 ...

    django框架模板语言使用方法详解

    本文实例讲述了django框架模板语言使用方法。分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑。模板不仅仅是一个html文件,还包括了页面中的模板语言。...

    bleach:Bleach是基于允许列表HTML清理库,可转义或剥离标记和属性

    Bleach还可以安全地链接文本,应用Django的urlize过滤器无法过滤的过滤器,还可以选择设置rel属性,即使在文本中已有的链接上也是如此。 Bleach旨在清理来自不受信任来源的文本。 如果您发现自己不知所措,从而使...

    ReviewManager:该应用程序用于通过客户端API和网站转义功能从客户端请求公司评论

    django网络应用程序,用于使用带有客户端信息的Flask REST API通过文本和电子邮件从客户端请求Google评论,并借助网络抓取工具进行更新以更新客户端评论状态。这样的自动化使ABQ医生办公室的Google评论数量增加了250...

Global site tag (gtag.js) - Google Analytics