ySJ
|
2.0/chapter09/#241 |
2010-04-15 19:26:08
|
这是一个模板的例子:
|
|
ySJ
|
2.0/chapter09/#240 |
2010-04-15 19:25:52
|
有时,你可能想阻止一部分自动转意,对另一部分自动转意。
|
|
ySJ
|
2.0/chapter09/#236 |
2010-04-15 19:25:03
|
为了控制模板的自动转意,用标签autoescape来包装整个模板(或者模板中常用的部分),就像这样:
|
|
ySJ
|
2.0/chapter09/#234 |
2010-04-15 19:24:15
|
对于模板块
|
|
ySJ
|
2.0/chapter09/#231 |
2010-04-15 19:23:48
|
你可以把<emphasis>safe</emphasis>当做<emphasis>safe from further escaping</emphasis>的简写,或者<emphasis>当做可以被直接译成HTML的内容</emphasis>。在这个例子里,如果<literal>数据</literal>包含<literal>''</literal>,那么输出会变成:
|
|
ySJ
|
2.0/chapter09/#226 |
2010-04-15 19:19:12
|
对于单独的变量
|
|
ySJ
|
2.0/chapter09/#224 |
2010-04-15 19:18:45
|
或者,你可能正在使用Django的模板系统生成非html文本,比如一封e-mail。
|
|
ySJ
|
2.0/chapter09/#223 |
2010-04-15 19:18:10
|
例如,你可能在数据库里存储了一段被信任的html代码,并且你想直接把它嵌入到你的模板里。
|
|
ySJ
|
2.0/chapter09/#222 |
2010-04-15 19:15:11
|
因为有时候模板变量包含了一些原始html数据,在这种情况下我们不想它们的内容被转意。
|
|
ySJ
|
2.0/chapter09/#219 |
2010-04-15 19:10:13
|
如果你不想数据被自动转意,在每一站点级别、每一模板级别或者每一变量级别你都有几种方法来关闭它。
|
|
ySJ
|
2.0/chapter09/#212 |
2010-04-15 19:09:15
|
<literal>&</literal>被转换为<literal>&</literal> |
|
ySJ
|
2.0/chapter09/#212 |
2010-04-15 19:08:41
|
<literal>&</literal>被转换为<literal>&</literal> |
|
ySJ
|
2.0/chapter09/#208 |
2010-04-15 19:08:11
|
<literal>'</literal>(单引号)被转换为<literal>'</literal> |
|
ySJ
|
2.0/chapter09/#210 |
2010-04-15 19:07:53
|
<literal>"</literal>(双引号)被转换为<literal>"</literal> |
|
ySJ
|
2.0/chapter09/#208 |
2010-04-15 19:06:57
|
<literal>'</literal>被转换为<literal>'</literal> |
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 19:03:42
|
|
|
ySJ
|
2.0/chapter09/#198 |
2010-04-15 19:03:18
|
二是,你可以利用Django的自动html转意。
|
|
ySJ
|
2.0/chapter09/#195 |
2010-04-15 19:02:36
|
这是最初几年Django的默认方案,但是这样做的问题是它把责任推给<emphasis>你</emphasis>(开发者、模版作者)自己,来确保把所有东西转意。
|
|
ySJ
|
2.0/chapter09/#195 |
2010-04-15 19:02:15
|
这是最初几年Django的默认方案,但是这样做的问题是它把责任推给<emphasis>你</emphasis>(开发者、模版作者)自己,来确保转意每一件事情。
|
|
ySJ
|
2.0/chapter09/#194 |
2010-04-15 19:00:17
|
一是你可以确保每一个不被信任的变量都被<literal>escape</literal>过滤器处理一遍,把潜在有害的html字符转换为无害的。
|
|
ySJ
|
2.0/chapter09/#189 |
2010-04-15 18:58:01
|
这类漏洞称为被跨域脚本 (XSS) 攻击。
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:54:11
|
username
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:53:53
|
username
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:53:43
|
username
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:53:12
|
username
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:48:55
|
username
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:48:38
|
username
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:47:31
|
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:47:00
|
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:46:53
|
username
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:46:36
|
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:45:29
|
username
|
|
ySJ
|
2.0/chapter09/#179 |
2010-04-15 18:44:27
|
类似的,如果用户名包含<literal></literal>,就像这样:username
|
|
ySJ
|
2.0/chapter09/#179 |
2010-04-15 18:44:13
|
类似的,如果用户名包含<literal></literal>,就像这样:username
|
|
ySJ
|
2.0/chapter09/#179 |
2010-04-15 18:43:47
|
类似的,如果用户名包含<literal></literal>,就像这样:username
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:41:14
|
username
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:40:57
|
username
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:40:46
|
name
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:40:38
|
|
|
ySJ
|
2.0/chapter09/#181 |
2010-04-15 18:40:16
|
username
|
|
ySJ
|
2.0/chapter09/#179 |
2010-04-15 18:39:41
|
类似的,如果用户名包含<literal></literal>,就像这样:
|
|
ySJ
|
2.0/chapter09/#174 |
2010-04-15 18:38:35
|
用这个用户名,模板将被渲染成:
|
|
ySJ
|
2.0/chapter09/#171 |
2010-04-15 18:38:04
|
一开始,这看起来是显示用户名的一个无害的途径,但是考虑如果用户输入如下的名字将会发生什么:
|
|
ySJ
|
2.0/chapter09/#163 |
2010-04-15 18:35:51
|
建议你把它们放在应用或者工程目录下名为 <literal>context_processors.py</literal> 的文件里。
|
|
ySJ
|
2.0/chapter09/#162 |
2010-04-15 18:34:01
|
不论它们存放在哪个物理路径下,只要在你的Python搜索路径中,你就可以在 <literal>TEMPLATE_CONTEXT_PROCESSORS</literal> 设置里指向它们。
|
|
ySJ
|
2.0/chapter09/#159 |
2010-04-15 18:31:32
|
要注意 <literal>TEMPLATE_CONTEXT_PROCESSORS</literal> 里的context processor 将会在基于这个settings.py的<emphasis>每个</emphasis> 模板中有效,所以变量的命名不要和模板的变量冲突。
|
|
ySJ
|
2.0/chapter09/#157 |
2010-04-15 18:26:48
|
使用多个处理器是很容易的,所以你可以根据逻辑块来分解功能以便将来复用。
|
|
ySJ
|
2.0/chapter09/#132 |
2010-04-15 17:30:14
|
细心的读者可能会注意到<literal>debug</literal>模板变量的值永远不可能为<literal>False</literal>,因为如果<literal>DEBUG</literal>是<literal>False</literal>,那么<literal>debug</literal>模板变量一开始就不会被RequestContext所包含。
|
|
ySJ
|
2.0/chapter09/#117 |
2010-04-15 17:18:05
|
如果<literal>TEMPLATE_CONTEXT_PROCESSORS</literal>包含这个处理器,每一个<literal>RequestContext</literal>将包含这些变量:
|
|
ySJ
|
2.0/chapter09/#112 |
2010-04-15 17:02:02
|
关于users、permissions和messages的更多内容请参考第14章。
|
|