DJANGO基础学习之转义总结:escape,autoescape,safe,mark_safe
PS:转义其实就是把HTML代码给转换成HTML实体了!
默认情况下,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’<div>’
>>> H=’{% autoescape on %}{{div}}{% endautoescape %}’
>>> c = template.Context({’div’:”<div>”}, autoescape=False)
>>> template.Template(H).render(c)
u’<div>’
>>>
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))
- 顶
- 0
- 踩
DJANGO基础学习之转义总结:escape,autoescape,safe,mark_safe的更多相关文章
- Django基础学习二
今天继续学习django的基础 学习用户提交url如何获得返回值 1.首先需要在工程的urls文件定义指定的urls要路由给哪个函数 在这个例子中,我们定义home的urls路由给views里的tes ...
- Django基础学习笔记
Django开发流程 创建一个django项目:命令:django-admin startproject 项目名 进入到项目并创建一个应用:命令:python manage.py startapp 应 ...
- Django基础学习七之如何配置django+mysql
很久没有更新博客了,也有段时间没有持续性的学习了,感觉堕落了,今天继续开始学习吧 今天主要来学习一下在django下配置mysql的数据库和使用admin用户管理数据库 1.在project中的set ...
- Django基础学习六之渲染
今天简单的介绍一下Django的template的渲染和Django的template的基本的语法 首先我们先启动一个django的shell,首先需要进入django的工程目录下启动django的s ...
- Django基础学习五_引入静态文件
今天继续学习Django,今天主要掌握两个小点 一.如果为Django项目中引入静态文件 1.先要在project目录下创建static的目录,然后将jquery文件拷贝这个目录下就可以了 2.在pr ...
- Django基础学习四_数据库的增删改查
今天主要学习两个东西 1.如何对数据库做增删改查 2.如果将数据库中的数据用html的方式返回到前台 一.对数据库中增删改查操作 1.首先需要先见表,见表的方法我们在“http://www.cnblo ...
- Django基础学习三_路由系统
今天主要来学习一下Django的路由系统,视频中只学了一些皮毛,但是也做下总结,主要分为静态路由.动态路由.二级路由 一.先来看下静态路由 1.需要在project中的urls文件中做配置,然后将匹配 ...
- Django基础学习一
Django需要安装Django和jinja2,所以在开始学习之前,要先按照Django模块和jinja2模块,Django默认的数据库是SQLite,所以建议大家在学习之前需要先安装SQLite 一 ...
- Django基础学习之Cookie 和 Sessions 应用
在Django里面,使用Cookie和Session看起来好像是一样的,使用的方式都是request.COOKIES[XXX]和request.session[XXX],其中XXX是您想要取得的东西的 ...
随机推荐
- 【Install】我是如何安装Linux类系统的
安装系统:ubuntu12.04 i386 DVD U盘启动12.04live系统 连线,设置连接 安装系统到硬盘 “语言支持”,更新 安装gnome经典界面 sudo apt-get i ...
- JavaScript复习笔记——字符串
String构造器可以使用new调用,也可以不使用,但是,这两种调用的结果也是完全不一样的.用new调用的时候,String作为构造器函数,创建字符串对象.不使用new的时候,String用作一个常规 ...
- java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。
//------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...
- CentOS 7 更新源 – 使用国内 163 yum 源
突然想起试试 Docker,在一台计算机上安装了 CentOS 7,准备开工,突然想起还需要做一件事情,更改源,不然安装肯定会很慢,网上搜索了一下,文章很多,但是会出一些问题,所以将自己的成功的日志写 ...
- Codefroces Gym 100781A(树上最长路径)
http://codeforces.com/gym/100781/attachments 题意:有N个点,M条边,问对两两之间的树添加一条边之后,让整棵大树最远的点对之间的距离最近,问这个最近距离是多 ...
- ecstore2.0数据库词典
数据库词典= 数据库tables列表 =|| Name | Comment ||| sdb_aftersales_return_product | 售后申请 || sdb_b2c_brand | 商品 ...
- python: shutil模块 -拷贝文件
import shutil #拷贝文件 #存在文档1文件 shutil.copyfile('文档1','新文件') 随机验证码-4位 import random random_code='' for ...
- 【转】Android WebView 播放视频总结
今天发现 WebView里播放优酷的视频点击播放按钮后没反应,于是看官方文档和搜索解决,下面是我在别人基础上做的补充: android webView 无法播放视频,无法暂停,继续播放视频问题,无 ...
- YTU 2986: 删除区间内的元素(线性表)
2986: 删除区间内的元素(线性表) 时间限制: 1 Sec 内存限制: 2 MB 提交: 8 解决: 3 题目描述 若一个线性表L采用顺序存储结构,其中元素都为整数.设计一个算法,删除元素值在 ...
- 最简单的C/S程序——让服务器来做加法
还在写“Hello world!”式的单机程序吗?还在各种拖控件吗?是否自己都觉得有点low呢?来个质的飞跃吧!看看怎么让服务器帮咱做加法! 所谓C/S程序就是Client/Server程序,自然既包 ...