ySJ
|
2.0/chapter09/#208 |
2010-04-15 19:08:11
|
<literal>'</literal>(单引号)被转换为<literal>'</literal> |
|
ySJ
|
2.0/chapter09/#254 |
2010-04-15 19:36:08
|
基于Pyhton的开发者(编写VIEWS视图和自定义过滤器)只需要考虑哪些数据不需要被转意,适时的标记数据,就可以让它们在模板中工作。
|
|
ySJ
|
2.0/chapter09/#256 |
2010-04-15 19:37:02
|
如果你正在编写一个模板而不知道是否要关闭自动转意,那就为所有需要转意的变量添加一个escape过滤器。
|
|
ySJ
|
2.0/chapter09/#257 |
2010-04-15 19:38:03
|
当自动转意开启时,使用escape过滤器似乎会两次转意数据,但其实没有任何危险。因为escape过滤器不作用于被转意过的变量。
|
|
ySJ
|
2.0/chapter09/#259 |
2010-04-15 19:42:06
|
过滤器参数里的字符串常量的自动转义
|
|
ySJ
|
2.0/chapter09/#264 |
2010-04-15 19:42:39
|
所有字符常量没有经过转义就被插入模板,就如同它们都经过了safe过滤。
|
|
ySJ
|
2.0/chapter09/#265 |
2010-04-15 19:43:47
|
这是由于字符常量完全由模板作者决定,因此编写模板的时候他们会确保文本的正确性。
|
|
ySJ
|
2.0/chapter09/#273 |
2010-04-15 19:44:38
|
来源于变量本身的数据不受影响。
|
|
ySJ
|
2.0/chapter09/#274 |
2010-04-15 19:46:46
|
如果必要,变量内容会自动转义,因为它们不在模板作者的控制下。
|
|
ySJ
|
2.0/chapter09/#273 |
2010-04-15 19:47:47
|
这点对来自变量本身的数据不起作用。
|
|
ySJ
|
2.0/chapter09/#285 |
2010-04-15 19:49:47
|
<literal>django.template.loader.select_template(template_name_list)</literal> : <literal>select_template</literal> 很像 <literal>get_template</literal> ,不过它是以模板名称的列表作为参数的。
|
|
ySJ
|
2.0/chapter09/#286 |
2010-04-15 19:51:10
|
它会返回列表中存在的第一个模板。
|
|
ySJ
|
2.0/chapter09/#248 |
2010-04-15 19:29:28
|
由于在base模板中自动转意被关闭,所以在child模板中自动转意也会关闭.因此,在下面一段HTML被提交时,变量greeting的值就为字符串Hello!
|
|
ySJ
|
2.0/chapter09/#244 |
2010-04-15 19:26:39
|
auto-escaping 标签的作用域不仅可以影响到当前模板还可以通过include标签作用到其他标签,就像block标签一样。
|
|
ySJ
|
2.0/chapter09/#241 |
2010-04-15 19:26:08
|
这是一个模板的例子:
|
|
ySJ
|
2.0/chapter09/#212 |
2010-04-15 19:08:41
|
<literal>&</literal>被转换为<literal>&</literal> |
|
ySJ
|
2.0/chapter09/#212 |
2010-04-15 19:09:15
|
<literal>&</literal>被转换为<literal>&</literal> |
|
ySJ
|
2.0/chapter09/#219 |
2010-04-15 19:10:13
|
如果你不想数据被自动转意,在每一站点级别、每一模板级别或者每一变量级别你都有几种方法来关闭它。
|
|
ySJ
|
2.0/chapter09/#222 |
2010-04-15 19:15:11
|
因为有时候模板变量包含了一些原始html数据,在这种情况下我们不想它们的内容被转意。
|
|
ySJ
|
2.0/chapter09/#223 |
2010-04-15 19:18:10
|
例如,你可能在数据库里存储了一段被信任的html代码,并且你想直接把它嵌入到你的模板里。
|
|
ySJ
|
2.0/chapter09/#224 |
2010-04-15 19:18:45
|
或者,你可能正在使用Django的模板系统生成非html文本,比如一封e-mail。
|
|
ySJ
|
2.0/chapter09/#226 |
2010-04-15 19:19:12
|
对于单独的变量
|
|
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/#234 |
2010-04-15 19:24:15
|
对于模板块
|
|
ySJ
|
2.0/chapter09/#236 |
2010-04-15 19:25:03
|
为了控制模板的自动转意,用标签autoescape来包装整个模板(或者模板中常用的部分),就像这样:
|
|
ySJ
|
2.0/chapter09/#240 |
2010-04-15 19:25:52
|
有时,你可能想阻止一部分自动转意,对另一部分自动转意。
|
|
ySJ
|
2.0/chapter09/#287 |
2010-04-15 19:51:48
|
如果模板都不存在,将会触发<literal>TemplateDoesNotExist</literal>异常。
|
|
ySJ
|
2.0/chapter09/#174 |
2010-04-15 18:38:35
|
用这个用户名,模板将被渲染成:
|
|
ySJ
|
2.0/chapter08/#413 |
2010-04-14 17:13:14
|
优化后的代码和前面的功能一样,但是减少了代码冗余。
|
|
ySJ
|
2.0/chapter08/#472 |
2010-04-14 17:47:28
|
因此,这个技术只有在你确定被包含指向的每个视图都正确接收这些额外选项的时候才有用。
|
|
ySJ
|
2.0/chapter08/#476 |
2010-04-14 17:48:19
|
这一章提供了很多视图和URLconfs的高级提示和技巧。
|
|
ySJ
|
2.0/chapter08/#476 |
2010-04-14 17:48:33
|
这一章提供了很多关于视图和URLconfs的高级提示和技巧。
|
|
ySJ
|
2.0/chapter08/#476 |
2010-04-14 17:48:45
|
这一章提供了很多关于视图和URLconfs的高级提示技巧。
|
|
ySJ
|
2.0/chapter08/#477 |
2010-04-14 17:49:46
|
接下来,在<reference name="Chapter 9" refuri="../chapter09/">第九章</reference>,我们将会把这个先进的处理方案应用到Django的模板系统。
|
|
ySJ
|
2.0/chapter08/#480 |
2010-04-14 17:50:40
|
Hosting公司谨奉
|
|
ySJ
|
2.0/chapter09/#3 |
2010-04-15 11:03:32
|
虽然大多数和Django模板语言的交互都是模板作者的工作,但你可能想定制和扩展模板引擎,让它做一些它不能做的事情,或者是以其他方式让你的工作更轻松。
|
|
ySJ
|
2.0/chapter09/#7 |
2010-04-15 11:05:03
|
它也包含一个自动转意特征,如果你继续使用django,随着时间的推移你一定会注意这个安全考虑。
|
|
ySJ
|
2.0/chapter09/#9 |
2010-04-15 11:08:35
|
如果你想把Django的模版系统作为另外一个应用程序的一部分(就是说,仅使用Django的模板系统而不使用Django框架的其他部分),那你一定要读一下“配置独立模式下的模版系统”这一节。
|
|
ySJ
|
2.0/chapter09/#13 |
2010-04-15 11:08:54
|
首先,让我们快速回顾一下第四章介绍的若干专业术语:
|
|
ySJ
|
2.0/chapter09/#15 |
2010-04-15 11:09:31
|
<emphasis>模板</emphasis> 是一个纯文本文件,或是一个用Django模板语言标记过的普通的Python字符串。
|
|
ySJ
|
2.0/chapter08/#471 |
2010-04-14 17:46:15
|
这个例子和前面关于被捕获的参数一样(在上一节就解释过这一点),额外的选项将 <emphasis>总是</emphasis> 被传递到被包含的URLconf中的 <emphasis>每一</emphasis> 行,不管那一行对应的视图是否确实作为有效参数接收这些选项。
|
|
ySJ
|
2.0/chapter08/#463 |
2010-04-14 17:45:13
|
比如,下面的两个URLconf在功能上是一样的。
|
|
ySJ
|
2.0/chapter08/#456 |
2010-04-14 17:44:14
|
因此,这个技术只有在你确定被包含只向的每个视图都需要那个被传递的参数的时候才有用。
|
|
ySJ
|
2.0/chapter08/#407 |
2010-04-14 17:15:43
|
函数requires_login,传入一个视图函数view,然后返回一个新的视图函数new_view.这个新的视图函数new_view在函数requires_login内定义,
|
|
ySJ
|
2.0/chapter08/#408 |
2010-04-14 17:16:23
|
它处理request.user.is_authenticated()这个验证,从而决定是否执行原来的view函数。
|
|
ySJ
|
2.0/chapter08/#414 |
2010-04-14 17:21:15
|
现在我们创建了一个漂亮而通用的函数requires_login()来帮助我们包装所有需要验证是否登录的视图。
|
|
ySJ
|
2.0/chapter08/#418 |
2010-04-14 17:24:07
|
如果你试图让你的代码用在多个基于Django的站点上,你应该考虑以能被包含的方式来处理你的URLconf。
|
|
ySJ
|
2.0/chapter08/#421 |
2010-04-14 17:26:02
|
本质上这是把URL连接成树。
|
|
ySJ
|
2.0/chapter08/#425 |
2010-04-14 17:26:57
|
(之前在第6章介绍Django的admin模块时我们曾经见过include。
|
|
ySJ
|
2.0/chapter08/#426 |
2010-04-14 17:27:12
|
admin模块有他自己的URLconf,你仅仅只需要在你自己的代码中加入include就可以了。)
|
|