第 0 章:引言

第 0 章:引言

欢迎阅读《Django for Beginners》!本书采用项目驱动的学习方法,带你掌握使用 Django 进行 Web 开发。Django 是一个免费且开源的 Web 框架,使用 Python 编写。从学生和创业者到全球最大的网站(包括 Instagram、YouTube、Reddit、Netflix、Dropbox 和 Spotify),都在使用 Django。它秉承”开箱即用”(batteries-included)的理念,提供了创建强大、真实 Web 应用所需的所有内置功能。这正是其口号”为追求完美的赶工者打造的 Web 框架”的由来。

Django 丰富的功能可能会让新手感到不知所措。官方提供的投票教程和官方文档面向的是中高级 Web 开发者,而非初学者,这并没有起到太大的帮助作用。

好消息是,作为一个”松耦合”(loosely coupled)框架,Django 的各个组件可以独立工作,也可以协同工作,具有高度的模块化。换句话说,你只需要使用(和学习)你需要的部分。即使是有多年经验的专业开发者,也只会用到该框架的一部分功能——它实在太庞大、太广泛了,不可能将所有特性都塞进一个项目中。

不过你会发现,几乎每个 Django 网站都会反复出现相同的模式和任务:创建和结构化新项目、连接和查询数据库、添加业务逻辑、执行 CRUD(创建-读取-更新-删除)操作、处理用户账户和表单等。Django 不应该是令人望而生畏的;事实上,它本不该如此!几乎每个能想到的用例都有内置的解决方案——这正是文档的用途!但没有人——即使是编写了大量文档的原始创建者和核心开发者——能把所有内容都记在脑子里。你也不应该试图这样做!

这本书最初是我在构建 Django 项目时的个人笔记。我花了很长时间才内化并适应 Django 的结构。我的突破点在于,我意识到真正加深理解的方式是创建一个个逐步复杂化的项目,每个项目专注于一个新概念或新技能。最终,我把笔记整理成一系列博客文章发表,并因其受欢迎程度而创作了这本书——现在已经是第五版了。

在本书中,你将学习如何构建、测试和部署六个逐步复杂的 Web 应用。我们将从一个”Hello, World”应用开始,最后构建一个真实的新闻网站(Newspaper),它汇集了书中涵盖的所有基础概念和技术,包括模型、视图、URL、模板、表单、用户账户、权限等。

到本书结束时,你应该能自信地从零创建 Django 项目,并具备足够的背景知识,能够利用更高级的学习资源填补任何知识空白。

为什么要学习 Django?

Django 最初于 2003 年秋季在《劳伦斯世界日报》(Lawrence Journal-World)报社创建,以著名爵士吉他手 Django Reinhardt 的名字命名;它于 2005 年 7 月作为免费开源项目发布。如今它已有近二十年的历史,在软件领域已经相当成熟,但它依然蓬勃发展,甚至可以说比以往任何时候都更具活力。每周都有两位数的全新代码提交被接受并入框架,每月有安全更新和 bug 修复版本发布,每八个月有一次主要版本更新。一个庞大的第三方包生态系统在核心框架之外提供了额外的功能。

Django 使用可读性极佳且功能强大的 Python 编程语言编写,Python 可以说是当今世界上最流行的语言。Python 是大多数本科计算机科学课程的默认选择,是数据科学和人工智能领域的主导语言,并在科研领域被广泛使用。它的易用性和广泛的适用性使 Python 几乎适合任何任务。

Django 继承了 Python “开箱即用”的理念,内置了丰富的功能供开发者使用,包括:

  • 认证系统:一个功能完善且安全的用户账户、权限组和基于 cookie 的用户会话系统
  • 模板引擎:一种简单的语法,用于添加变量和逻辑来创建动态 HTML
  • 表单:一个强大的表单库,处理渲染和验证
  • URL 路由:一个清晰优雅的 URL 架构,易于维护和理解
  • 管理后台:一种可视化方式,用于交互所有网站数据,包括用户和数据库表
  • 国际化:多语言支持,以及日期、时间、数字和时区的本地化格式
  • 安全:防御 SQL 注入、跨站脚本(XSS)、跨站请求伪造(CSRF)、点击劫持和远程代码执行

这种方式让 Web 开发者能够专注于应用的独特之处,而不是每次都重新发明轮子。数百万用户已经使用和测试过这些必要的代码,因此你可以确信它们是安全且高性能的。

相比之下,一些 Web 框架(如 Flask)采用微框架(microframework)方法,只提供简单网页所需的最基本功能。Flask 远比 Django 轻量,允许最大程度的灵活性;然而,这需要开发者付出代价。构建一个简单的 Flask 网站需要添加十几个或更多的第三方包,而这些包不一定是最新的、安全的或可靠的。缺乏”护栏”也意味着 Flask 的项目结构差异很大,这使得在不同项目之间切换时难以维持最佳实践。Flask 是一个不错的 Web 框架选择,但与 Django 这样功能齐全的选项相比,它有不同的优势和劣势。

Django 的老开发者们之间流传着一句话:“为框架而来,为社区而留。” 这确实不假!Django 拥有一个异常温暖和热情的社区,欢迎各个层次的程序员。这在每年由志愿者举办的 DjangoCon 会议和本地聚会上都有体现。

数以百万计的程序员已经使用 Django 构建了他们的网站,每年还有数百万人投靠 Django,因为当你能够依靠一个由优秀开发者组成的大型社区时,重新发明轮子是没有意义的——他们已经为我们完成了艰苦的工作。

预备知识

你不需要有 Python 或 Web 开发的先前经验就能完成本书。即使是编程和 Web 开发的新手,也能跟着本书感受到从零编写 Web 应用的魔力。不过,熟悉基本的 Python、HTML 和 CSS 将大大有助于巩固你对核心概念的理解。每当 Django 与其他 Web 框架不同时,书中都会提供参考说明;最明显的例子是,Django 采用了 MVT(Model-View-Template)方法,与主流的 MVC(Model-View-Controller)模式略有不同。一旦我们开始编写代码,我们会详细讨论这些差异。

Django 5 的新特性

Django 5.0 于 2023 年 12 月发布,官方支持 Python 3.10、3.11 和 3.12。需要注意的是,Django 的版本策略是基于时间而非基于功能的。大约每八个月会发布一个新的功能版本,同时根据需要进行每月的 bug 修复和安全补丁。Django 还遵循 .0、.1、.2 然后回到 .0 的功能版本模式,这意味着你可以预期 Django 5.1 在 2024 年 8 月发布,Django 5.2 在 2025 年 4 月发布,Django 6.0 在 2025 年 12 月发布,以此类推。Django 拥有如此庞大和活跃的贡献者社区,以至于多年前就决定专注于定期发布,而不是等待特定功能完成。

特定版本(以 .2 结尾的版本,如 Django 5.2 和 6.2)被指定为长期支持(LTS)版本,并在保证期内(通常为三年)接收安全和数据丢失修复。这一政策旨在为大型企业公司和那些不希望每八个月升级一次的组织提供稳定的 Django 版本。

那么,Django 5.0 有什么新特性呢?最重要的变化是表单字段渲染现在大大简化了。管理后台新增了 Facet 过滤器,以便于更轻松的 UI 筛选;现在可以实现数据库计算的默认值;官方支持 Python 3.10、3.11 和 3.12。Django 多年来一直在逐步添加异步支持,这个版本在 auth 模块中新增了一个用于控制用户认证的异步函数。但对升级到最新版本的开发者来说,最明显的变化可能是退出登录链接现在必须使用 POST 而非 GET 请求。

Django 是一个成熟的 Web 框架,力求在保持稳定的同时紧跟现代 Web 的发展步伐。如果你发现自己所在的项目使用较旧版本的 Django,可以参考详细的升级指南来更新到最新版本。

本书结构

本书首先在第 1 章中演示如何在 Windows 和 macOS 上配置本地开发环境。然后我们学习强大的命令行、Git、文本编辑器配置,以及如何安装最新版本的 Python 和 Django。

在第 2 章中,我们回顾网站和 Web 框架的工作原理,然后深入介绍 Django 架构。接着我们构建第一个项目——一个极简的 Hello, World 网站,同时学习视图、URLs 和应用。我们甚至用 Git 保存工作,并将副本上传到 GitHub 上的远程代码仓库。

在第 3 章中,我们制作、测试并部署一个个人网站,介绍基于函数的视图、模板和 Django 模板语言。我们探索模板上下文,并使用 Django 内置的测试框架编写第一个测试。

第 4 章涵盖基于类的视图、模板继承和更高级的测试模式,我们将构建一个公司网站。这是我们在转向 Django 模型和基于数据库的网站之前的最后一个项目。

我们在第 5 章构建第一个数据驱动的网站——一个留言板。我们将学习 Django 的 ORM(对象关系映射),它用 Python 代码定义数据库模型,并自动翻译成支持多种数据库后端的正确 SQL(PostgreSQL、MySQL、SQLite、MariaDB 和 Oracle)。我们将探索内置的管理应用,它提供了一种图形化的方式与数据进行交互。当然,我们也会为所有代码编写测试,并在 GitHub 上保存远程副本。

在第 6-8 章中,我们准备构建一个实现 CRUD(创建-读取-更新-删除)功能的博客网站。先使用基于函数的视图,然后切换到 Django 的通用类视图,我们只需编写很少的实际代码。然后,我们添加表单,并集成 Django 内置的用户认证系统,实现注册、登录和退出登录功能。

本书的其余部分致力于构建和部署一个可供生产环境使用的新闻网站。第 9 章演示了如何使用自定义用户模型和适当的测试来设置一个新项目。第 10 章涵盖了从登录、退出登录到注册的完整用户认证流程,第 11 章添加了 Bootstrap 以增强 CSS 样式。第 12 章通过电子邮件实现密码重置和修改,第 13-15 章我们添加了文章、评论、适当的权限和授权。最后,第 16 章涵盖了面向生产环境的部署。

总结部分概述了书中介绍的核心概念,并推荐了进一步学习的资源清单。虽然跳过某些章节可能很诱人,但我建议按顺序阅读。每一章都引入一个新概念,并建立在前几章的基础上。

到本书结束时,你将扎实地掌握 Django,能够构建自己的应用,并具备充分利用其他中高级 Django 学习资源的背景知识。

本书排版

本书中有很多代码示例,格式如下:

# 这是 Python 代码
print("Hello, World!")

为简洁起见,当现有代码未发生变化时,我们使用三个点 ...。发生变化的代码部分会使用 # new 注释来高亮。

def make_my_website():
    ...
    print("All done!")
    # new

遇到困难时的建议

遇到问题卡住了——每个层次的程序员都会经历。随着职业发展,唯一变化的是问题的难度。学会接受这种挫败感、寻求帮助、提出有针对性的问题,以及判断什么时候最好的做法是离开电脑、出去走走清醒一下头脑——这些都是成为更好开发者的一部分。

好消息是,无论你遇到什么错误,你很可能不是第一个!把错误信息复制粘贴到 Google 或 DuckDuckGo 这样的搜索引擎中,通常能找到 StackOverflow 或个人博客上关于同一问题的讨论。有经验的程序员经常开玩笑说,他们和初级程序员之间唯一的区别就是他们能更快地用 Google 找到答案。这确实有些道理。

当然,你不能完全相信在网上看到的一切。随着经验的积累,你将逐渐培养出理解 Django 和代码各部分如何组合在一起的背景知识。

如果你在本书的某个地方卡住了该怎么办?首先,仔细对照书中的代码检查你的代码。如果仍然卡住,你可以查看官方源代码,在 GitHub 上即可找到。一个常见的问题是微妙的空白差异,肉眼几乎无法察觉。如果你怀疑是这个问题,可以尝试复制粘贴官方源代码。

下一步是离开电脑,甚至好好睡一觉。在解决问题时,一点点的休息和距离感对你的大脑有惊人的作用。

有两个出色的在线资源是 Django 社区聚集问答的地方。第一个是官方 Django 论坛,第二个是 Django Users Google 群组。如果你需要额外的帮助,每个都是极好的下一步选择。

社区

Django 的成功不仅归功于其技术成就,也归功于其社区。“为框架而来,为社区而留”是 Django 开发者中常说的口号。这种精神延伸到 Django 的技术开发,通过 django-developers 邮件列表 在线进行;也延伸到监督 Django 的非营利组织 Django 软件基金会、年度 DjangoCon 会议,以及开发者聚集在一起分享知识和见解的本地 meetup。

无论你的技术专长如何,参与 Django 都是学习、结识其他开发者和提升声誉的好方法。

总结

在下一章中,你将学习如何正确设置你的计算机并创建你的第一个 Django 项目。让我们开始吧!