第 0 章:简介¶
欢迎来到《Django 入门教程》,这是一本以项目为导向的书籍,旨在使用 Django[^1] 学习 Web 开发。Django 是一个用 Python 编写的免费开源 Web 框架。从学生、创业者到全球最大的网站——包括 Instagram、YouTube、Reddit、Netflix、Dropbox 和 Spotify——都在使用 Django。它的"自带电池"方式提供了快速创建强大的真实世界 Web 应用所需的所有内置功能,正如它的标语所说:"为有截止日期的完美主义者打造的 Web 框架。"
Django 丰富的功能可能会让新手感到不知所措。官方的 polls 教程和官方文档面向的是中高级 Web 开发者,而非初学者,这更增加了难度。
好消息是,作为一个"松耦合"框架,Django 的各个组件既可以独立使用也可以组合使用,具有高度的模块化。换句话说,你只需要使用(和学习)你所需要的部分。即使是有多年经验的专业开发者也只会使用框架提供的部分功能;它实在太庞大、太广泛了,不可能把所有功能都塞进一个项目中。
不过你会发现,几乎每个 Django 网站都会遇到相同的模式和任务:创建并组织新项目、连接并查询数据库、添加逻辑、执行 CRUD(创建-读取-更新-删除)操作、处理用户账户和表单等等。Django 不必让人感到不知所措;事实上,它不应该如此!几乎每个可以想到的用例都有内置解决方案:这就是文档存在的意义!但没有人——即使是编写了大量文档的原始创建者和核心开发者——能把所有内容都记在脑子里。你也不应该试图这样做!
本书最初是我构建 Django 项目时的个人笔记。我花了很长时间才真正内化并适应了 Django 的结构。为了巩固我的理解,最好的方式是创建逐渐复杂的项目,每个项目专注于一个新的概念或技能。最终,我把笔记以博客文章的形式发布了出来,并根据它们的受欢迎程度编写了这本书,现在已经是第五版了。
在本书中,你将学习如何构建、测试和部署六个逐渐复杂的 Web 应用。我们将从一个"Hello, World"应用开始,最终构建一个真实世界的新闻网站,将书中涵盖的所有基本概念和技术——包括模型、视图、URL、模板、表单、用户账户、权限等——融会贯通。
读完本书后,你应该能够自信地从零创建 Django 项目,并具备利用更高级的教育资源填补任何知识空白的基础。
为什么要学习 Django?¶
Django 最初于 2003 年秋天在劳伦斯《世界日报》报社创建,并以著名的爵士吉他手 Django Reinhardt 命名;2005 年 7 月作为免费开源项目发布。这使得它现在已经有近二十年的历史了,在软件领域算是相当成熟的,但它一直在蓬勃发展,可以说比以往任何时候都更具活力。每周都有两位数的新代码提交被接受到框架中,每月都有安全和错误修复发布,每八个月发布一个重要新版本。庞大的第三方包生态系统提供了核心框架之外的额外功能。
Django 使用可读性强且功能强大的 Python 编程语言编写,Python 可以说是当今世界上最受欢迎的编程语言。Python 是大多数本科计算机科学课程的默认选择,是数据科学和人工智能的主导语言,并广泛应用于科学研究。其易用性和广泛的适用性使 Python 几乎适合任何任务。
Django 继承了 Python 的"自带电池"理念,为 Web 开发中的常规任务提供了丰富的内置功能,包括:
- ORM(对象关系映射器):使用 Python 而非原始 SQL 来创建和查询数据库表
- 认证系统:功能完善且安全的用户账户、组、权限和基于 cookie 的用户会话系统
- 模板引擎:简单的语法,用于在 HTML 中添加变量和逻辑以创建动态页面
- 表单:强大的表单库,处理渲染和验证
- URL 路由:简洁优雅的 URL 模式,易于维护和推理
- 管理后台:可视化方式与所有网站数据交互,包括用户和数据库表
- 国际化:多语言支持以及针对特定地区的日期、时间、数字和时区格式化
- 安全性:防范 SQL 注入、跨站脚本攻击、跨站请求伪造、点击劫持和远程代码执行
这种方式使 Web 开发者能够专注于应用的独特之处,而不是每次都重新发明轮子。数百万用户已经使用和测试了所需的代码,因此你可以确信它是安全且高性能的。
相比之下,像 Flask 这样的一些 Web 框架采用微框架的方式,仅提供简单网页所需的最基本功能。Flask 比 Django 轻量得多,允许最大的灵活性;然而,这对开发者来说是有代价的。构建一个简单的 Flask 网站需要添加十几个甚至更多的第三方包,这些包可能是也可能不是最新的、安全的或可靠的。缺乏规范也意味着 Flask 的项目结构差异很大,这使得在不同项目之间切换时难以保持最佳实践。Flask 是一个不错的 Web 框架选择;只是与 Django 这样的全功能选项相比,它有各自不同的优缺点。
在资深 Django 开发者中有一句话:"因为框架而来,因为社区而留。"这确实是事实!Django 拥有一个异常温暖和热情的社区,欢迎各个级别的程序员,体现在每年由志愿者组织的跨多个大洲的 DjangoCon 大会、活跃的论坛讨论,以及各大城市的定期聚会。与其他由公司或个人运营的开源项目不同,Django 通过 Django 软件基金会以非营利组织的形式运作,其目标是推广、支持和推进该 Web 框架。其董事会每年由社区投票选举产生。
数百万程序员已经使用 Django 构建了他们的网站,每年还有更多的人选择它,因为当你可以依靠一群才华横溢的开发者的庞大社区——他们已经替我们完成了艰苦的工作——时,重新发明轮子是没有意义的。
前置要求¶
你不需要之前的 Python 或 Web 开发经验就能完成本书。即使是编程和 Web 开发的新手也能跟上并感受到从零编写 Web 应用的魔力。然而,对基础 Python、HTML 和 CSS 的熟悉将大大帮助你巩固对核心概念的理解。书中在 Django 与其他 Web 框架不同的地方都有相应的参考说明;最明显的例子是 Django 采用了一种 MVT(模型-视图-模板)方法,与主流的 MVC(模型-视图-控制器)模式略有不同。一旦我们开始编写代码,我们将深入讨论这些差异。
Django 5 的新特性¶
Django 5.0 于 2023 年 12 月发布,官方支持 Python 3.10、3.11 和 3.12。需要注意的是,Django 的版本发布策略是基于时间的,而非基于功能的。大约每八个月会发布一个新功能版本,同时根据需要每月发布错误修复和安全补丁。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 快速发布节奏的大公司设计的。不过,如果条件允许,最好的安全策略是使用最新版本,而非 LTS 版本。
那么,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 网站——同时学习视图、URL 和应用。我们甚至用 Git 保存我们的工作,并将副本上传到 GitHub 上的远程代码仓库。
在第 3 章中,我们制作、测试和部署一个个人网站,引入基于函数的视图、模板和 Django 模板语言。我们探索模板上下文,并使用 Django 内置的测试框架编写第一批测试。
基于类的视图、模板继承和更高级的测试模式在第 4 章中介绍,我们构建一个公司网站。这是我们转向 Django 模型和数据库驱动网站之前的最后一个项目。
我们在第 5 章构建第一个数据库驱动项目——一个留言板网站。Django 提供了强大的 ORM(对象关系映射器),使我们无需编写原始 SQL。相反,我们可以在 models.py 文件中编写 Python 代码,ORM 会自动将其转换为多种数据库后端(PostgreSQL、MySQL、SQLite、MariaDB 和 Oracle)的正确 SQL。我们将探索内置的管理后台应用,它提供了与数据交互的图形化方式。当然,我们还为所有代码编写测试,并在 GitHub 上存储远程副本。
在第 6-8 章中,我们准备构建一个博客网站,实现 CRUD(创建-读取-更新-删除)功能。先使用基于函数的视图,然后切换到 Django 的通用类视图,我们只需要编写少量实际代码即可实现。然后,我们添加表单并集成 Django 内置的用户认证系统,实现注册、登录和登出功能。
本书的其余部分专门用于构建和部署一个生产就绪的新闻网站。第 9 章演示如何使用自定义用户模型和适当的测试来设置新项目。第 10 章涵盖登录、登出和注册的完整用户认证流程,第 11 章添加 Bootstrap 以增强 CSS 样式。第 12 章通过电子邮件实现密码重置和修改,在第 13-15 章中,我们添加文章、评论、适当的权限和授权。最后,第 16 章涵盖生产就绪的部署。
结语部分概述了书中介绍的核心概念,并提供了进一步学习的推荐资源列表。虽然你可能会想要跳着阅读本书,但我建议按顺序阅读各章。每章都引入新概念,并建立在之前的教学内容之上。
读完本书后,你将对 Django 有扎实的理解,能够构建自己的应用,并具备充分利用中级和高级 Django 技术学习资源的背景知识。
本书排版¶
本书中有许多代码示例,格式如下:
# This is Python code
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 软件基金会监督,还有每年的 DjangoCon 大会和开发者们分享知识和见解的本地聚会。
无论你的技术水平如何,参与 Django 社区都是学习、结识其他开发者和提升声誉的好方法。
小结¶
在下一章中,你将学习如何正确设置你的电脑并创建你的第一个 Django 项目。让我们开始吧!