Django框架是专门帮助开发人员快速、高效地构建健壮和功能强大的Web应用程序而设计的。其间,Django框架负责处理大量的枯燥和重复的工作,解决诸如项目结构、数据库对象-关系映射、模板机制、表单验证、会话、身份验证、安全性、Cookie管理、国际化、基本管理和脚本的数据访问接口等问题。Django构建于Python编程语言之上,该语言自身强制执行清晰和易读的代码。除了核心框架,Django的设计目的是让开发人员能够创建第三方模块,进而可与自己的应用程序结合使用。另外,Django有个已经建立的充满活力的社区,读者可从中查找源代码、寻求帮助并贡献自己的意见。
本书将利用Django 3.0框架指导读者完成Web开发过程中的各个阶段。首先将讨论项目的配置和结构;随后介绍如何使用复用组件以定义数据库结构,以及如何通过项目的生命周期对其进行管理。相应地,本书将通过表单和视图访问输入和列出数据。此外,我们还将处理响应式模板和JavaScript以增强用户体验。接下来,我们将通过自定义过滤器和标签提升Django的模板系统,从而使前端开发更具灵活性。在此之后,我们还将细化管理界面,以简化内容编辑器的工作流。据此,我们将重点转移至项目的稳定性和健壮性上,进而优化应用程序,同时提升应用程序的安全性。随后将介绍如何高效地存储和管理层次结构,并展示如何从不同的数据源收集数据。其间将会发现,以某些格式向其他处提供自身的数据比想象中的要更加简单。接下来将介绍Django项目代码的编程和调试技巧,并通过一些有效的选择方案测试代码。在本书的最后,我们还将展示如何将项目部署至产品中,并通过设置维护操作完成开发周期。
与其他一些仅涉及框架自身的Django书籍相比,本书引入了一些较为重要的第三方模块和工具以帮助我们完成Web开发。除此之外,我们还借助Bootstrap前端框架和jQuery JavaScript库提供了一些示例,从而简化某些高级、复杂的用户界面的创建工作。
适用读者
如果读者具有一定的Django使用经验,并想进一步提升自己的技能,那么本书将十分适合于你。本书适用于中级和专业Django开发人员,旨在构建多语言、安全的、响应式的、可伸缩的健壮型项目。
本书内容
第1章将介绍Django项目所需的基本设置和配置步骤,其中涉及虚拟环境、Docker、不同环境和数据库间的项目设置。
第2章将解释如何编写模块构建过程中的可复用代码。这里,用新应用程序首先需要定义的是数据模块,这将构成项目的主要组成部分。随后将学习如何将多语言数据保存至数据库中。另外,本章还将学习如何利用Django迁移管理数据库模式变化和数据操控。
第3章将讨论如何构建视图和表单,用于数据显示和编辑。其间,我们将学习如何使用微格式和其他协议,以确保页面更具可读性,进而展示搜索结果和社交网络中的显示内容。另外,本章还将学习如何生成PDF文档和实现多语言搜索。
第4章将介绍模板和JavaScript结合使用的实际示例,其间将整合下列内容:面向用户的渲染模板表达信息,以及在现代站点中JavaScript提供的重要的增强内容,进而丰富用户体验。
第5章将介绍如何创建和使用自己的模板过滤器和标签。其间将会看到,可扩展默认的Django模板系统以满足模板开发人员的要求。
第6章将探讨默认的Django管理界面,并引领读者通过自己的功能扩展该管理界面。
第7章将深入讨论Django固有或外部的项目安全和优化方法。
第8章将介绍Django中树状结构的创建和操控,同时还将django-mptt或treebeard库引入工作流。本章将展示如何使用这两种库实现层次结构的显示和管理。
第9章将讨论不同格式的数据转换,以及不同数据源的提供者。同时,本章将采用自定义管理命令实现数据导入,并通过站点图、RSS和REST API实现数据导出。
第10章将展示一些额外的代码片段和技巧,这对于日常的Web开发和调试十分有用。
第11章将引入不同的测试类型,并提供多个特征示例用以测试项目代码。
第12章将处理针对Python Package Index的第三方应用程序部署,以及专用服务器的Django项目部署。
第13章将解释如何创建数据库备份、为常规任务设置计划作业,以及如何生成日志事件以供进一步查看。
本书资源
采用Django 3.0实现本书示例时,需要安装下列内容:
? Python 3.6或更高版本。
? 操控图像的Pillow库。
? MySQL数据库和mysqlclient绑定库,或者基于psycopg2-binary绑定库的PostgreSQL数据库。
? Docker Desktop或Docker Toolbox用以实现完整系统虚拟化效果,或者一个内建的虚拟环境,以使每个项目的Python模块处于分离状态。
? 针对版本控制的Git。
本书所涉及的软件和硬件如表1所示。
表1
软件和硬件 操 作 系 统
Python 3.6 或更高版本
Django 3.0.X
PostgreSQL 11.4或更高版本/MySQL 5.6或更高版本 最新的基于UNIX的操作系统,如macOS或Linux(也有可能在Windows操作系统上进行开发)
除此之外,其他的特定需求将在每个示例中单独提到。
读者可采用任何代码编辑器编辑项目文件,但这里推荐使用PyCharm(https://www. jetbrains.com/pycharm/)或Visual Studio Code(https://code.visualstudio.com/)。
注意:
全部代码示例均通过Django 3.0测试,且应可与Django的后续版本协同工作。
下载示例代码文件
读者可通过www.packt.com账户下载本书的示例代码文件。如果读者购买了本书,则可访问www.packtpub.com/support并注册,我们将把相关文件通过电子邮件直接发送于您。
下列步骤展示了代码文件的下载过程。
? 登录www.packt.com并注册。
? 选择Support选项卡。
? 单击Code Downloads按钮。
? 在搜索框中输入本书名称,并遵循相应的指令。
待文件下载完毕后,确保利用下列软件的最新版本解压或析取文件夹。
? WinRAR/7-Zip(Windows环境)。
? Zipeg/iZip/UnRarX(Mac环境)。
? 7-Zip/PeaZip(Linux环境)。
除此之外,本书的代码包还托管于GitHub上,对应网址为https://github.com/ PacktPublishing/Django-3-Web-Development-Cookbook-Fourth-Edition,且代码将与已有的GitHub储存库同步更新。
另外,读者还可访问https://github.com/PacktPublishing/查看其他图书的代码包、丰富的资源分类和视频内容。
本书惯例
本书涵盖了以下文本惯例。
代码块如下所示。
# requirements/dev.txt
-r _base.txt
coverage
django-debug-toolbar
selenium
需要强调的特定代码采用粗体表示,如下所示。
class Idea(CreationModificationDateBase, MetaTagsBase, UrlBase):
title = models.CharField(
_("Title"),
max_length=200,
)
content = models.TextField(
_("Content"),
)
命令行输入或输出内容如下所示。
(env)$ pip install -r requirements/dev.txt
图标表示警告或重要事项。
图标表示提示或操作技巧。
读者反馈和客户支持
欢迎读者对本书提出建议或意见并予以反馈。
对此,读者可向customercare@packtpub.com发送邮件,并以书名作为邮件标题。
勘误表
尽管我们希望本书做到尽善尽美,但疏漏依然在所难免。如果读者发现谬误,无论是文字错误抑或是代码错误,还望不吝赐教。对此,读者可访问http://www.packtpub.com/ submit-errata,选取对应书籍,输入并提交相关问题的详细内容。
版权须知
一直以来,互联网上的版权问题从未间断,Packt出版社对此类问题异常重视。若读者在互联网上发现本书任意形式的副本,请告知我们网络地址或网站名称,我们将对此予以处理。关于盗版问题,读者可发送邮件至copyright@packtpub.com。
若读者针对某项技术具有专家级的见解,抑或计划撰写书籍或完善某部著作的出版工作,则可访问authors.packtpub.com。
问题解答
读者对本书有任何疑问,均可发送邮件至questions@packtpub.com,我们将竭诚为您服务。
第1章 Django 3.0开始之旅 1
1.1 简介 1
1.2 技术需求 2
1.3 与虚拟环境协同工作 2
1.3.1 准备工作 2
1.3.2 实现方式 3
1.3.3 工作方式 3
1.3.4 延伸阅读 3
1.4 创建一个项目文件结构 4
1.4.1 准备工作 4
1.4.2 实现方式 4
1.4.3 工作方式 6
1.4.4 更多内容 7
1.4.5 延伸阅读 7
1.5 利用pip处理项目依赖项 8
1.5.1 准备工作 8
1.5.2 实现方式 8
1.5.3 工作方式 9
1.5.4 更多内容 10
1.5.5 延伸阅读 10
1.6 针对开发、测试、预发布和产品环境,配置设置项 10
1.6.1 准备工作 10
1.6.2 实现方式 11
1.6.3 工作方式 12
1.6.4 延伸阅读 12
1.7 在设置项中定义相对路径 12
1.7.1 准备工作 13
1.7.2 实现方式 13
1.7.3 工作方式 13
1.7.4 延伸阅读 14
1.8 处理敏感设置项 14
1.8.1 准备工作 14
1.8.2 实现方式 14
1.8.3 工作方式 15
1.8.4 更多内容 15
1.8.5 延伸阅读 16
1.9 在项目中包含外部依赖项 16
1.9.1 准备工作 17
1.9.2 实现方式 17
1.9.3 工作方式 18
1.9.4 延伸阅读 18
1.10 以动态方式设置STATIC_URL 19
1.10.1 准备工作 19
1.10.2 实现方式 19
1.10.3 工作方式 20
1.10.4 更多内容 20
1.10.5 延伸阅读 22
1.11 将UTF-8设置为MySQL配置的默认编码机制 22
1.11.1 准备工作 22
1.11.2 实现方式 22
1.11.3 工作方式 23
1.11.4 更多内容 23
1.11.5 延伸阅读 23
1.12 创建Git忽略文件 23
1.12.1 准备工作 23
1.12.2 实现方式 23
1.12.3 工作方式 25
1.12.4 延伸阅读 25
1.13 删除Python编译文件 25
1.13.1 准备工作 25
1.13.2 实现方式 26
1.13.3 工作方式 26
1.13.4 更多内容 26
1.13.5 延伸阅读 26
1.14 遵循Python文件中的导入顺序 26
1.14.1 准备工作 26
1.14.2 实现方式 27
1.14.3 工作方式 27
1.14.4 更多内容 27
1.14.5 延伸阅读 28
1.15 创建应用程序配置 28
1.15.1 准备工作 28
1.15.2 实现方式 28
1.15.3 工作方式 29
1.15.4 更多内容 30
1.15.5 延伸阅读 30
1.16 定义可覆写的应用程序设置项 30
1.16.1 准备工作 31
1.16.2 实现方式 31
1.16.3 工作方式 33
1.16.4 延伸阅读 33
1.17 针对Django、Gunicorn、Nginx和PostgreSQL,与Docker容器协同工作 33
1.17.1 准备工作 34
1.17.2 实现方式 34
1.17.3 工作方式 38
1.17.4 更多内容 41
1.17.5 延伸阅读 41
第2章 模型和数据库结构 43
2.1 简介 43
2.2 技术需求 43
2.3 使用模型混入 44
2.3.1 准备工作 44
2.3.2 实现方式 44
2.3.3 工作方式 45
2.3.4 更多内容 45
2.3.5 延伸阅读 46
2.4 利用与URL相关的方法创建一个模型混入 46
2.4.1 准备工作 47
2.4.2 实现方式 47
2.4.3 工作方式 48
2.4.4 延伸阅读 49
2.5 创建一个模型混入以处理日期的创建和修改 50
2.5.1 准备工作 50
2.5.2 实现方式 50
2.5.3 工作方式 51
2.5.4 延伸阅读 51
2.6 创建一个模型混入以关注元标签 51
2.6.1 准备工作 52
2.6.2 实现方式 52
2.6.3 工作方式 54
2.6.4 延伸阅读 54
2.7 创建一个模型混入以处理Generic Relation 54
2.7.1 准备工作 55
2.7.2 实现方式 55
2.7.3 工作方式 58
2.7.4 延伸阅读 59
2.8 处理多语言字段 59
2.8.1 准备工作 59
2.8.2 实现方式 60
2.8.3 工作方式 64
2.8.4 延伸阅读 65
2.9 与模型翻译表协同工作 65
2.9.1 准备工作 66
2.9.2 实现方式 66
2.9.3 工作方式 69
2.9.4 延伸阅读 70
2.10 避免环状依赖项 71
2.10.1 准备工作 71
2.10.2 实现方式 71
2.10.3 延伸阅读 73
2.11 添加数据库约束 73
2.11.1 准备工作 73
2.11.2 实现方式 73
2.11.3 工作方式 74
2.11.4 更多内容 75
2.11.5 延伸阅读 76
2.12 使用迁移 76
2.12.1 准备工作 77
2.12.2 实现方式 77
2.12.3 工作方式 78
2.12.4 更多内容 78
2.12.5 延伸阅读 79
2.13 将外键修改为多对多字段 79
2.13.1 准备工作 79
2.13.2 实现方式 81
2.13.3 工作方式 83
2.13.4 更多内容 84
2.13.5 延伸阅读 84
第3章 表单和视图 85
3.1 简介 85
3.2 技术需求 85
3.3 利用CRUDL函数创建一个应用程序 86
3.3.1 准备工作 86
3.3.2 实现方式 89
3.3.3 工作方式 92
3.3.4 更多内容 92
3.3.5 延伸阅读 93
3.4 保存模型实例的作者 93
3.4.1 准备工作 93
3.4.2 实现方式 93
3.4.3 工作方式 94
3.4.4 延伸阅读 95
3.5 上传图像 95
3.5.1 准备工作 95
3.5.2 实现方式 95
3.5.3 工作方式 98
3.5.4 延伸阅读 99
3.6 利用自定义模板创建一个表单布局 99
3.6.1 准备工作 99
3.6.2 实现方式 100
3.6.3 工作方式 103
3.6.4 延伸阅读 105
3.7 利用django-crispy-forms创建一个表单布局 105
3.7.1 准备工作 105
3.7.2 实现方式 106
3.7.3 工作方式 108
3.7.4 更多内容 109
3.7.5 延伸阅读 110
3.8 与表单集协同工作 110
3.8.1 准备工作 110
3.8.2 实现方式 110
3.8.3 工作方式 118
3.8.4 更多内容 120
3.8.5 延伸阅读 120
3.9 过滤对象列表 121
3.9.1 准备工作 121
3.9.2 实现方式 122
3.9.3 工作方式 127
3.9.4 延伸阅读 127
3.10 管理分页列表 128
3.10.1 准备工作 128
3.10.2 实现方式 128
3.10.3 工作方式 131
3.10.4 延伸阅读 132
3.11 合成基于类的视图 132
3.11.1 准备工作 132
3.11.2 实现方式 132
3.11.3 工作方式 134
3.11.4 更多内容 135
3.11.5 延伸阅读 135
3.12 提供Open Graph和Twitter Card数据 135
3.12.1 准备工作 135
3.12.2 实现方式 135
3.12.3 工作方式 138
3.12.4 延伸阅读 138
3.13 提供schema.org词汇表 139
3.13.1 准备工作 139
3.13.2 实现方式 139
3.13.3 工作方式 141
3.13.4 延伸阅读 141
3.14 生成PDF文档 142
3.14.1 准备工作 142
3.14.2 实现方式 142
3.14.3 工作方式 146
3.14.4 延伸阅读 147
3.15 利用Haystack和Whoosh实现多语言搜索 147
3.15.1 准备工作 147
3.15.2 实现方式 148
3.15.3 工作方式 153
3.15.4 延伸阅读 154
3.16 利用Elasticsearch DSL实现多语言搜索 154
3.16.1 准备工作 154
3.16.2 实现方式 154
3.16.3 工作方式 162
3.16.4 延伸阅读 163
第4章 模板和JavaScript 165
4.1 简介 165
4.2 技术需求 165
4.3 安排base.html模板 166
4.3.1 准备工作 166
4.3.2 实现方式 166
4.3.3 工作方式 168
4.3.4 延伸阅读 169
4.4 使用Django Sekizai 170
4.4.1 准备工作 170
4.4.2 实现方式 171
4.4.3 工作方式 172
4.4.4 延伸阅读 172
4.5 公开JavaScript中的设置项 172
4.5.1 准备工作 172
4.5.2 实现方式 173
4.5.3 工作方式 175
4.5.4 延伸阅读 176
4.6 使用HTML 5数据属性 176
4.6.1 准备工作 176
4.6.2 实现方式 179
4.6.3 工作方式 185
4.6.4 延伸阅读 187
4.7 提供响应式图像 187
4.7.1 准备工作 187
4.7.2 实现方式 187
4.7.3 工作方式 190
4.7.4 更多内容 192
4.7.5 延伸阅读 192
4.8 实现连续的滚动 192
4.8.1 准备工作 192
4.8.2 实现方式 193
4.8.3 工作方式 197
4.8.4 更多内容 199
4.8.5 延伸阅读 199
4.9 在模式对话框中打开对象的细节信息 199
4.9.1 准备工作 200
4.9.2 实现方式 200
4.9.3 工作方式 203
4.9.4 延伸阅读 204
4.10 实现Like微件 204
4.10.1 准备工作 205
4.10.2 实现方式 206
4.10.3 工作方式 210
4.10.4 延伸阅读 212
4.11 通过Ajax上传图像 212
4.11.1 准备工作 212
4.11.2 实现方式 212
4.11.3 工作方式 221
4.11.4 更多内容 223
4.11.5 延伸阅读 223
第5章 自定义模板过滤器和标签 225
5.1 简介 225
5.2 技术需求 225
5.3 遵循自定义的模板过滤器和标签规则 226
5.4 创建一个模板过滤器以显示帖子发布的天数 227
5.4.1 准备工作 227
5.4.2 实现方式 227
5.4.3 工作方式 228
5.4.4 更多内容 229
5.4.5 延伸阅读 229
5.5 创建一个模板过滤器以析取第一个媒体对象 229
5.5.1 准备工作 229
5.5.2 实现方式 230
5.5.3 工作方式 230
5.5.4 更多内容 231
5.5.5 延伸阅读 231
5.6 创建一个模板过滤器以识别URL 232
5.6.1 准备工作 232
5.6.2 实现方式 232
5.6.3 工作方式 233
5.6.4 延伸阅读 233
5.7 创建一个模板标签以包含一个模板 233
5.7.1 准备工作 233
5.7.2 实现方式 234
5.7.3 工作方式 235
5.7.4 更多内容 236
5.7.5 延伸阅读 237
5.8 创建一个模板标签以加载模板中的QuerySet 237
5.8.1 准备工作 237
5.8.2 实现方式 239
5.8.3 工作方式 241
5.8.4 延伸阅读 242
5.9 创建一个模板标签以作为模板解析内容 242
5.9.1 准备工作 242
5.9.2 实现方式 243
5.9.3 工作方式 244
5.9.4 延伸阅读 245
5.10 创建模板标签以调整请求查询参数 245
5.10.1 准备工作 245
5.10.2 实现方式 246
5.10.3 工作方式 248
5.10.4 延伸阅读 250
第6章 模型管理 251
6.1 简介 251
6.2 技术需求 251
6.3 自定义修改列表页面上的列 251
6.3.1 准备工作 252
6.3.2 实现方式 254
6.3.3 工作方式 255
6.3.4 延伸阅读 257
6.4 创建可排序的内联 257
6.4.1 准备工作 257
6.4.2 实现方式 258
6.4.3 工作方式 259
6.4.4 延伸阅读 260
6.5 创建管理动作 261
6.5.1 准备工作 261
6.5.2 实现方式 261
6.5.3 工作方式 264
6.5.4 延伸阅读 265
6.6 开发修改列表过滤器 265
6.6.1 准备工作 265
6.6.2 实现方式 265
6.6.3 工作方式 267
6.6.4 延伸阅读 268
6.7 修改第三方应用程序的应用程序标记 268
6.7.1 准备工作 268
6.7.2 实现方式 269
6.7.3 工作方式 269
6.7.4 延伸阅读 270
6.8 创建一个自定义账户应用程序 270
6.8.1 准备工作 270
6.8.2 实现方式 270
6.8.3 工作方式 274
6.8.4 延伸阅读 276
6.9 获取用户头像 277
6.9.1 准备工作 277
6.9.2 实现方式 277
6.9.3 更多内容 284
6.9.4 延伸阅读 284
6.10 将一幅地图插入至修改表单中 285
6.10.1 准备工作 285
6.10.2 实现方式 289
6.10.3 工作方式 297
6.10.4 延伸阅读 300
第7章 安全和性能 301
7.1 简介 301
7.2 技术需求 301
7.3 表单的跨站点请求伪造安全 302
7.3.1 准备工作 302
7.3.2 实现方式 302
7.3.3 工作方式 304
7.3.4 更多内容 304
7.3.5 延伸阅读 305
7.4 基于内容安全政策的请求安全 306
7.4.1 准备工作 306
7.4.2 实现方式 306
7.4.3 工作方式 307
7.4.4 延伸阅读 309
7.5 使用django-admin-honeypot 309
7.5.1 准备工作 310
7.5.2 实现方式 310
7.5.3 工作方式 310
7.5.4 更多内容 311
7.5.5 延伸阅读 313
7.6 实现密码验证 313
7.6.1 准备工作 313
7.6.2 实现方式 313
7.6.3 工作方式 316
7.6.4 更多内容 317
7.6.5 延伸阅读 317
7.7 下载授权文件 317
7.7.1 准备工作 317
7.7.2 实现方式 317
7.7.3 工作方式 320
7.7.4 延伸阅读 320
7.8 向图像中添加动态水印 321
7.8.1 准备工作 321
7.8.2 实现方式 321
7.8.3 工作方式 324
7.8.4 延伸阅读 325
7.9 基于Auth0的身份验证 325
7.9.1 准备工作 325
7.9.2 实现方式 326
7.9.3 工作方式 330
7.9.4 延伸阅读 332
7.10 缓存方法的返回值 332
7.10.1 准备工作 332
7.10.2 实现方式 332
7.10.3 工作方式 333
7.10.4 更多内容 334
7.10.5 延伸阅读 335
7.11 使用Memcached缓存Django视图 335
7.11.1 准备工作 335
7.11.2 实现方式 336
7.11.3 工作方式 337
7.11.4 延伸阅读 337
7.12 使用Redis缓存Django视图 337
7.12.1 准备工作 338
7.12.2 实现方式 338
7.12.3 工作方式 339
7.12.4 更多内容 340
7.12.5 延伸阅读 340
第8章 层次结构 341
8.1 简介 341
8.2 技术需求 343
8.3 利用django-mptt创建层次分类 343
8.3.1 准备工作 343
8.3.2 实现方式 343
8.3.3 工作方式 345
8.3.4 延伸阅读 346
8.4 利用django-mptt-admin创建分类管理界面 346
8.4.1 准备工作 347
8.4.2 实现方式 347
8.4.3 工作方式 348
8.4.4 延伸阅读 349
8.5 利用django-mptt在模板中渲染分类 350
8.5.1 准备工作 351
8.5.2 实现方式 351
8.5.3 工作方式 352
8.5.4 更多内容 353
8.5.5 延伸阅读 353
8.6 利用django-mptt和单选字段在表单中选择分类 353
8.6.1 准备工作 353
8.6.2 实现方式 354
8.6.3 工作方式 355
8.6.4 延伸阅读 356
8.7 利用django-mptt在表单中通过复选框列表选择多个分类 356
8.7.1 准备工作 357
8.7.2 实现方式 357
8.7.3 工作方式 362
8.7.4 延伸阅读 363
8.8 利用django-treebeard创建层次分类 363
8.8.1 准备工作 364
8.8.2 实现方式 364
8.8.3 工作方式 365
8.8.4 更多内容 366
8.8.5 延伸阅读 367
8.9 利用django-treebeard创建分类管理界面 367
8.9.1 准备工作 367
8.9.2 实现方式 367
8.9.3 工作方式 368
8.9.4 延伸阅读 370
第9章 导入和导出数据 371
9.1 简介 371
9.2 技术需求 371
9.3 从本地CSV文件中导入数据 371
9.3.1 准备工作 372
9.3.2 实现方式 374
9.3.3 工作方式 376
9.3.4 延伸阅读 377
9.4 从本地Excel文件中导入数据 378
9.4.1 准备工作 378
9.4.2 实现方式 378
9.4.3 工作方式 380
9.4.4 延伸阅读 381
9.5 从外部JSON文件中导入数据 381
9.5.1 准备工作 382
9.5.2 实现方式 384
9.5.3 工作方式 387
9.5.4 延伸阅读 388
9.6 从外部XML文件中导入数据 388
9.6.1 准备工作 388
9.6.2 实现方式 389
9.6.3 工作方式 392
9.6.4 更多内容 393
9.6.5 延伸阅读 393
9.7 针对搜索引擎准备分页网站地图 394
9.7.1 准备工作 394
9.7.2 实现方式 396
9.7.3 工作方式 397
9.7.4 更多内容 398
9.7.5 延伸阅读 398
9.8 创建可过滤的RSS订阅 398
9.8.1 准备工作 398
9.8.2 实现方式 401
9.8.3 工作方式 404
9.8.4 延伸阅读 404
9.9 使用Django REST框架创建一个API 404
9.9.1 准备工作 404
9.9.2 实现方式 405
9.9.3 工作方式 406
9.9.4 延伸阅读 410
第10章 其他内容 411
10.1 简介 411
10.2 技术需求 411
10.3 使用Django shell 412
10.3.1 准备工作 412
10.3.2 实现方式 412
10.3.3 工作方式 416
10.3.4 延伸阅读 416
10.4 使用数据库查询表达式 416
10.4.1 准备工作 416
10.4.2 实现方式 418
10.4.3 工作方式 421
10.4.4 延伸阅读 423
10.5 slugify()函数的猴子补丁以获得更好的国际支持 423
10.5.1 准备工作 423
10.5.2 实现方式 424
10.5.3 更多内容 424
10.5.4 延伸阅读 425
10.6 切换调试工具栏 425
10.6.1 准备工作 425
10.6.2 实现方式 426
10.6.3 工作方式 428
10.6.4 延伸阅读 429
10.7 使用ThreadLocalMiddleware 429
10.7.1 准备工作 430
10.7.2 实现方式 430
10.7.3 工作方式 431
10.7.4 延伸阅读 432
10.8 使用信号通知管理员有关新的条目 432
10.8.1 准备工作 432
10.8.2 实现方式 433
10.8.3 工作方式 434
10.8.4 延伸阅读 435
10.9 检查缺失设置项 435
10.9.1 准备工作 435
10.9.2 实现方式 435
10.9.3 工作方式 437
10.9.4 延伸阅读 438
第11章 测试 439
11.1 简介 439
11.2 需求条件 439
11.3 利用Mock测试视图 440
11.3.1 准备工作 440
11.3.2 实现方式 440
11.3.3 工作方式 442
11.3.4 更多内容 443
11.3.5 延伸阅读 443
11.4 利用Selenium测试用户界面 443
11.4.1 准备工作 444
11.4.2 实现方式 444
11.4.3 工作方式 448
11.4.4 延伸阅读 449
11.5 利用Django REST框架测试API 449
11.5.1 准备工作 449
11.5.2 实现方式 449
11.5.3 工作方式 454
11.5.4 延伸阅读 454
11.6 确保测试覆盖率 455
11.6.1 准备工作 455
11.6.2 实现方式 455
11.6.3 工作方式 457
11.6.4 延伸阅读 457
第12章 部署 459
12.1 简介 459
12.2 技术需求 460
12.3 发布可复用的Django应用程序 460
12.3.1 准备工作 460
12.3.2 实现方式 460
12.3.3 工作方式 464
12.3.4 延伸阅读 464
12.4 针对预发布环境利用mod_wsgi在Apache上部署 464
12.4.1 准备工作 464
12.4.2 实现方式 465
12.4.3 工作方式 473
12.4.4 延伸阅读 475
12.5 针对产品环境利用mod_wsgi在Apache上部署 475
12.5.1 准备工作 475
12.5.2 实现方式 476
12.5.3 工作方式 480
12.5.4 延伸阅读 481
12.6 针对预发布环境在Nginx和Gunicorn上部署 481
12.6.1 准备工作 481
12.6.2 实现方式 482
12.6.3 工作方式 490
12.6.4 延伸阅读 492
12.7 针对产品环境在Nginx和Gunicorn上部署 492
12.7.1 准备工作 492
12.7.2 实现方式 493
12.7.3 工作方式 496
12.7.4 延伸阅读 497
第13章 维护 499
13.1 简介 499
13.2 技术需求 499
13.3 创建和恢复MySQL数据库备份 499
13.3.1 准备工作 500
13.3.2 实现方式 500
13.3.3 工作方式 503
13.3.4 延伸阅读 504
13.4 创建和恢复PostgreSQL数据库备份 504
13.4.1 准备工作 504
13.4.2 实现方式 504
13.4.3 工作方式 507
13.4.4 延伸阅读 509
13.5 设置常规作业的定时任务 509
13.5.1 准备工作 509
13.5.2 实现方式 509
13.5.3 工作方式 511
13.5.4 更多内容 512
13.5.5 延伸阅读 512
13.6 日志事件 512
13.6.1 准备工作 513
13.6.2 实现方式 513
13.6.3 工作方式 516
13.6.4 延伸阅读 517
13.7 通过电子邮件获取详细的错误报告 517
13.7.1 准备工作 517
13.7.2 实现方式 518
13.7.3 更多内容 519
13.7.4 延伸阅读 520