ySJ
|
2.0/chapter16/#592 |
2010-04-23 16:46:25
|
谨奉
|
|
ySJ
|
2.0/chapter16/#589 |
2010-04-23 16:46:02
|
在下一章,我们将介绍Django的中间件并解释怎样写出自己的中间件。
|
|
ySJ
|
2.0/chapter16/#588 |
2010-04-23 16:45:40
|
这些继承框架(CSRF、身份验证系统等等)通过提供 <emphasis>中间件</emphasis> 来实现其奇妙的功能。中间件是在请求之前/后执行的可以修改请求和响应的代码,它扩展了框架。
|
|
ySJ
|
2.0/chapter16/#583 |
2010-04-23 16:43:53
|
一旦完成了该项工作,在模板中通过 <literal>{% load markup %}</literal> 就能使用这些过滤器。
|
|
ySJ
|
2.0/chapter16/#579 |
2010-04-23 16:43:26
|
例如:<literal>textile</literal>过滤器吧Textile格式的文本转换为HTML。
|
|
ySJ
|
2.0/chapter16/#570 |
2010-04-23 16:41:48
|
包<literal>django.contrib.markup</literal>包含了一些列Django模板过滤器,每一个都实现了一中通用的标记语言。
|
|
ySJ
|
2.0/chapter16/#566 |
2010-04-23 16:40:47
|
可以传入整数或者表示整数的字符串。
|
|
ySJ
|
2.0/chapter16/#564 |
2010-04-23 16:40:36
|
254变成254th。
|
|
ySJ
|
2.0/chapter16/#556 |
2010-04-23 16:40:11
|
例子:
|
|
ySJ
|
2.0/chapter16/#550 |
2010-04-23 16:39:48
|
可以传入整数或者表示整数的字符串。
|
|
ySJ
|
2.0/chapter16/#540 |
2010-04-23 16:39:32
|
例子:
|
|
ySJ
|
2.0/chapter16/#533 |
2010-04-23 16:38:49
|
可以传入整数或者表示整数的字符串。
|
|
ySJ
|
2.0/chapter16/#523 |
2010-04-23 16:38:19
|
例子:
|
|
ySJ
|
2.0/chapter16/#501 |
2010-04-23 16:37:28
|
要激活这些过滤器,请把<literal>'django.contrib.humanize'</literal>加入到你的<literal>INSTALLED_APPS</literal>中。完成之后,向模版了加入<literal>{% load humanize %}</literal>就可以使用下面的过滤器了。
|
|
ySJ
|
2.0/chapter16/#500 |
2010-04-23 16:33:50
|
包<literal>django.contrib.humanize</literal>包含了一些是数据更人性化的模板过滤器。
|
|
ySJ
|
2.0/chapter16/#494 |
2010-04-23 16:32:22
|
(这是因为在页面发送到客户端之前,<literal>CsrfMiddleware</literal>使用正则表达式来添加<literal>csrfmiddlewaretoken</literal>字段到你的HTML中,而正则表达式不能处理不规范的HTML。)如果你怀疑出现了这样的问题。使用你浏览器的查看源代码功能以确定<literal>csrfmiddlewaretoken</literal>是否插入到了表单中。
|
|
ySJ
|
2.0/chapter16/#493 |
2010-04-23 16:26:53
|
在此情况下,表单提交永远无法成功。
|
|
ySJ
|
2.0/chapter16/#492 |
2010-04-23 16:26:29
|
如果你的应用程序以某种非常规的方法创建 HTML 页面(例如:在 Javascript 的<literal>document.write</literal>语句中发送 HTML 片段),你可能会绕开了向表单添加隐藏字段的过滤器。
|
|
ySJ
|
2.0/chapter16/#490 |
2010-04-23 16:25:51
|
(参阅第 14 章了解更多关于会话的内容。)如果你使用了自定义会话或者身份验证框架手动管理会话 cookies,该中间件将帮不上你的忙。
|
|
ySJ
|
2.0/chapter16/#475 |
2010-04-23 16:24:02
|
终止请求。
|
|
ySJ
|
2.0/chapter16/#474 |
2010-04-23 16:23:48
|
403 错误页面的内容是检测到了跨域请求伪装。
|
|
ySJ
|
2.0/chapter16/#474 |
2010-04-23 16:23:36
|
403 错误页面的内容检测到了跨域请求伪装。
|
|
ySJ
|
2.0/chapter16/#464 |
2010-04-23 16:21:57
|
参见第十五章的“MIDDLEWARE_CLASSES顺序”小节以了解更多。
|
|
ySJ
|
2.0/chapter16/#463 |
2010-04-23 16:20:58
|
同时,它也必须在响应被压缩或解压之前对响应结果进行处理,因此 <literal>CsrfMiddleware</literal> 必须在 <literal>GZipMiddleware</literal> 之后执行。一旦将它添加到<literal>MIDDLEWARE_CLASSES</literal>设置中,你就完成了工作。
|
|
ySJ
|
2.0/chapter16/#450 |
2010-04-23 16:19:20
|
这样,从服务器端访问表单时,可以检查该保密的字段。不吻合时可以引发一个错误。
|
|
ySJ
|
2.0/chapter16/#449 |
2010-04-23 16:19:02
|
的form标签一个隐藏字段,它的值是保密的并根据用户进程的 ID 生成。
|
|
ySJ
|
2.0/chapter16/#448 |
2010-04-23 16:18:04
|
第二步就是给所有 <literal>POST</literal> |
|
ySJ
|
2.0/chapter16/#449 |
2010-04-23 16:17:05
|
这样,从服务器端访问表单时,可以检查该保密的字段。
|
|
ySJ
|
2.0/chapter16/#436 |
2010-04-23 16:15:37
|
<literal>confirm</literal>。
|
|
ySJ
|
2.0/chapter16/#434 |
2010-04-23 16:14:05
|
这就确保了用简单的指向<literal>example.com/logout</literal>的<literal>POST</literal> 不会让用户登出;要让用户登出,用户必须通过 <literal>POST</literal> 向 <literal>example.com/logout</literal> 发送请求
|
|
ySJ
|
2.0/chapter16/#435 |
2010-04-23 16:12:08
|
并且发送一个值为'true'的POST变量。
|
|
ySJ
|
2.0/chapter16/#423 |
2010-04-23 16:09:09
|
很明显,登出一个邮件网站也不是什么严重的安全问题。但是同样的攻击可能针对任何相信用户的站点,比如在线银行和电子商务网站。这样的话可能在用户不知情的情况下就下订单付款了。
|
|
ySJ
|
2.0/chapter16/#418 |
2010-04-23 16:03:04
|
假定你已经登录到 <literal>example.com</literal> 的网页邮件账号。该网站有一个指向<literal>example.com/logout</literal>的注销按钮。就是说,注销其实就是访问<literal>example.com/logout</literal>。
|
|
ySJ
|
2.0/chapter16/#418 |
2010-04-23 15:59:46
|
假定你已经登录到 <literal>example.com</literal> 的网页邮件账号。该网站有一个只向<literal>example.com/logout</literal>的注销按钮。就是说,注销其实就是访问<literal>example.com/logout</literal>。
|
|
ySJ
|
2.0/chapter16/#414 |
2010-04-23 15:56:30
|
乍一看,要理解这种攻击技术比较困难,因此我们在本节将使用两个例子来说明。
|
|
ySJ
|
2.0/chapter16/#412 |
2010-04-23 15:54:54
|
CSRF, 又叫会话跳转,是一种网站安全攻击技术。
|
|
ySJ
|
2.0/chapter16/#405 |
2010-04-23 15:54:17
|
重定向表现为<literal>django/contrib/redirects/models.py</literal> 中的一个标准 Django 模型。因此,你可以通过Django数据库API来存取重定向对象,例如:
|
|
ySJ
|
2.0/chapter16/#403 |
2010-04-23 15:53:16
|
同过Python API
|
|
ySJ
|
2.0/chapter16/#398 |
2010-04-23 15:51:47
|
通过管理界面
|
|
ySJ
|
2.0/chapter16/#389 |
2010-04-23 15:50:48
|
注意
|
|
ySJ
|
2.0/chapter16/#376 |
2010-04-23 15:50:05
|
(查阅前面的“多站点”一节可了解关于 <literal>SITE_ID</literal> 和多站点框架的更多细节) 然后,它将执行以下两个步骤:
|
|
ySJ
|
2.0/chapter16/#371 |
2010-04-23 15:49:00
|
要了解更多信息,请参阅“增加、变更和删除重定向”一节。
|
|
ySJ
|
2.0/chapter16/#368 |
2010-04-23 15:48:33
|
这是一个简单的查询表,只有<literal>site_id</literal>、old_path和new_path三个字段。
|
|
ySJ
|
2.0/chapter16/#367 |
2010-04-23 15:48:13
|
<literal>manage.py syncdb</literal> 在数据库中创建了一个 <literal>django_redirect</literal> 表。
|
|
ySJ
|
2.0/chapter16/#365 |
2010-04-23 15:47:26
|
运行 <literal>manage.py syncdb</literal> 命令将所需的表添加到数据库中。
|
|
ySJ
|
2.0/chapter16/#350 |
2010-04-23 15:44:27
|
注意我们使用了<literal>safe</literal>模板过滤器来允许<literal>flatpage.content</literal>引入原始HTML而不必转义。
|
|
ySJ
|
2.0/chapter16/#340 |
2010-04-23 15:40:35
|
缺省情况下,系统使用模板 <literal>flatpages/default.html</literal> 来解析简单页面,但你也可以通过设定 <literal>FlatPage</literal> 对象的 <literal>template_name</literal> 字段来更改特定简单页面的模板。
|
|
ySJ
|
2.0/chapter16/#335 |
2010-04-23 15:39:40
|
前面已经提到,简单页面表现为 <literal>django/contrib/flatpages/models.py</literal> 中的标准 Django 模型。这样,你就可以使用Django数据库API来存取简单页面对象,例如:
|
|
ySJ
|
2.0/chapter16/#322 |
2010-04-23 15:33:52
|
通常,你可以把 <literal>FlatpageFallbackMiddleware</literal> 放在列表最后,因为它是最后的办法。
|
|
|
2.0/chapter07/#451 |
2010-04-23 15:33:34
|
一些提交的消息只有一两个单词,我们无法得知详细的信息。
|
根据下面的代码 应该是通过空格拆分英文单词的做法
|