ySJ
|
2.0/chapter16/#253 |
2010-04-23 15:03:24
|
尽管通常情况下总是搭建运行数据库驱动的 Web 应用,有时你还是需要添加一两张一次性的静态页面,例如“关于”页面,或者“隐私策略”页面等等。
|
|
ySJ
|
2.0/chapter16/#256 |
2010-04-23 15:07:09
|
这个问题的解决方案是使用位于 <literal>django.contrib.flatpages</literal> 开发包中的 Django 简单页面(flatpages)应用程序。该应用让你能够通过 Django 管理站点来管理这些一次性的页面,还可以让你使用 Django 模板系统指定它们使用哪个模板。
|
|
ySJ
|
2.0/chapter16/#257 |
2010-04-23 15:10:46
|
它在后台使用Django模型,这意味着它把页面项别的数据一样保存在数据库中,也就是说你可以使用标准Django数据库API来存取页面。
|
|
ySJ
|
2.0/chapter16/#260 |
2010-04-23 15:13:02
|
当创建简单页面时,你指定它与哪个URL以及和哪个站点相关联 。
|
|
ySJ
|
2.0/chapter16/#261 |
2010-04-23 15:13:28
|
(有关站点的更多信息,请查阅”多站点“一节。)
|
|
ySJ
|
2.0/chapter16/#267 |
2010-04-23 15:17:49
|
添加 <literal>'django.contrib.flatpages'</literal> 到 <literal>INSTALLED_APPS</literal> 设置。<literal>django.contrib.flatpages</literal>依赖<literal>django.contrib.sites</literal>,所以确保它们都在<literal>INSTALLED_APPS</literal>里。
|
|
ySJ
|
2.0/chapter16/#277 |
2010-04-23 15:19:54
|
该应用捆绑的 <literal>FlatPage</literal> 模型在 <literal>django/contrib/flatpages/models.py</literal> 进行定义,如下所示:
|
|
ySJ
|
2.0/chapter16/#289 |
2010-04-23 15:23:06
|
框架不对它作任何特殊处理。
|
|
ySJ
|
2.0/chapter16/#293 |
2010-04-23 15:24:14
|
框架不对它作任何特殊处理。
|
|
ySJ
|
2.0/chapter16/#300 |
2010-04-23 15:25:06
|
该设置项集成了 Djangos 验证/用户框架,该框架于第十四章详述。
|
|
ySJ
|
2.0/chapter16/#303 |
2010-04-23 15:26:26
|
该项设置集成了 Django 多站点框架,该框架在本章的“多站点”一节中有所阐述。
|
|
ySJ
|
2.0/chapter16/#306 |
2010-04-23 15:28:08
|
要了解更多内容,请查阅“添加、修改和删除简单页面”一节。
|
|
ySJ
|
2.0/chapter16/#309 |
2010-04-23 15:29:26
|
每当 Django 引发 404 错误,作为最后的办法,该中间件将根据所请求的 URL 检查简单页面数据库。
|
|
ySJ
|
2.0/chapter16/#312 |
2010-04-23 15:31:04
|
如果找到一个匹配项,它将载入该简单页面的模板(如果没有指定的话,将使用默认模板 <literal>flatpages/default.html</literal> )。
|
|
ySJ
|
2.0/chapter16/#313 |
2010-04-23 15:31:30
|
同时,它把一个简单的上下文变量<literal>flatpage</literal>(一个简单页面对象)传递给模板。
|
|
ySJ
|
2.0/chapter16/#314 |
2010-04-23 15:32:35
|
模板解析过程中,它实际用的是<literal>RequestContext</literal>。
|
|
ySJ
|
2.0/chapter16/#318 |
2010-04-23 15:32:59
|
注意
|
|
|
2.0/chapter07/#451 |
2010-04-23 15:33:34
|
一些提交的消息只有一两个单词,我们无法得知详细的信息。
|
根据下面的代码 应该是通过空格拆分英文单词的做法
|
ySJ
|
2.0/chapter16/#322 |
2010-04-23 15:33:52
|
通常,你可以把 <literal>FlatpageFallbackMiddleware</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/#340 |
2010-04-23 15:40:35
|
缺省情况下,系统使用模板 <literal>flatpages/default.html</literal> 来解析简单页面,但你也可以通过设定 <literal>FlatPage</literal> 对象的 <literal>template_name</literal> 字段来更改特定简单页面的模板。
|
|
ySJ
|
2.0/chapter16/#350 |
2010-04-23 15:44:27
|
注意我们使用了<literal>safe</literal>模板过滤器来允许<literal>flatpage.content</literal>引入原始HTML而不必转义。
|
|
ySJ
|
2.0/chapter16/#365 |
2010-04-23 15:47:26
|
运行 <literal>manage.py syncdb</literal> 命令将所需的表添加到数据库中。
|
|
ySJ
|
2.0/chapter16/#367 |
2010-04-23 15:48:13
|
<literal>manage.py syncdb</literal> 在数据库中创建了一个 <literal>django_redirect</literal> 表。
|
|
ySJ
|
2.0/chapter16/#368 |
2010-04-23 15:48:33
|
这是一个简单的查询表,只有<literal>site_id</literal>、old_path和new_path三个字段。
|
|
ySJ
|
2.0/chapter16/#371 |
2010-04-23 15:49:00
|
要了解更多信息,请参阅“增加、变更和删除重定向”一节。
|
|
ySJ
|
2.0/chapter16/#376 |
2010-04-23 15:50:05
|
(查阅前面的“多站点”一节可了解关于 <literal>SITE_ID</literal> 和多站点框架的更多细节) 然后,它将执行以下两个步骤:
|
|
ySJ
|
2.0/chapter16/#389 |
2010-04-23 15:50:48
|
注意
|
|
ySJ
|
2.0/chapter16/#398 |
2010-04-23 15:51:47
|
通过管理界面
|
|
ySJ
|
2.0/chapter16/#403 |
2010-04-23 15:53:16
|
同过Python API
|
|
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/#412 |
2010-04-23 15:54:54
|
CSRF, 又叫会话跳转,是一种网站安全攻击技术。
|
|
ySJ
|
2.0/chapter16/#414 |
2010-04-23 15:56:30
|
乍一看,要理解这种攻击技术比较困难,因此我们在本节将使用两个例子来说明。
|
|
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/#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/#423 |
2010-04-23 16:09:09
|
很明显,登出一个邮件网站也不是什么严重的安全问题。但是同样的攻击可能针对任何相信用户的站点,比如在线银行和电子商务网站。这样的话可能在用户不知情的情况下就下订单付款了。
|
|
ySJ
|
2.0/chapter16/#435 |
2010-04-23 16:12:08
|
并且发送一个值为'true'的POST变量。
|
|
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/#436 |
2010-04-23 16:15:37
|
<literal>confirm</literal>。
|
|
ySJ
|
2.0/chapter16/#449 |
2010-04-23 16:17:05
|
这样,从服务器端访问表单时,可以检查该保密的字段。
|
|
ySJ
|
2.0/chapter16/#448 |
2010-04-23 16:18:04
|
第二步就是给所有 <literal>POST</literal> |
|
ySJ
|
2.0/chapter16/#449 |
2010-04-23 16:19:02
|
的form标签一个隐藏字段,它的值是保密的并根据用户进程的 ID 生成。
|
|
ySJ
|
2.0/chapter16/#450 |
2010-04-23 16:19:20
|
这样,从服务器端访问表单时,可以检查该保密的字段。不吻合时可以引发一个错误。
|
|
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/#464 |
2010-04-23 16:21:57
|
参见第十五章的“MIDDLEWARE_CLASSES顺序”小节以了解更多。
|
|
ySJ
|
2.0/chapter16/#474 |
2010-04-23 16:23:36
|
403 错误页面的内容检测到了跨域请求伪装。
|
|
ySJ
|
2.0/chapter16/#474 |
2010-04-23 16:23:48
|
403 错误页面的内容是检测到了跨域请求伪装。
|
|
ySJ
|
2.0/chapter16/#475 |
2010-04-23 16:24:02
|
终止请求。
|
|
ySJ
|
2.0/chapter16/#490 |
2010-04-23 16:25:51
|
(参阅第 14 章了解更多关于会话的内容。)如果你使用了自定义会话或者身份验证框架手动管理会话 cookies,该中间件将帮不上你的忙。
|
|
ySJ
|
2.0/chapter16/#492 |
2010-04-23 16:26:29
|
如果你的应用程序以某种非常规的方法创建 HTML 页面(例如:在 Javascript 的<literal>document.write</literal>语句中发送 HTML 片段),你可能会绕开了向表单添加隐藏字段的过滤器。
|
|