第 0 章 引言

欢迎阅读本书!这是一本通过实战项目带你系统学习 Django Web 开发的实用教程。Django1 是基于 Python 构建的免费开源 Web 框架,应用场景极为广泛:无论是个人学习者、初创团队,还是 Instagram、YouTube、Reddit、Netflix、Dropbox、Spotify 等全球顶级平台,都在依托它搭建高效稳定的服务。它秉持开箱即用的设计理念,内置了开发健壮、实用 Web 应用所需的全部核心功能,也正因这份高效与完备,它被定义为:“为赶工期的完美主义者打造的 Web 框架”

对于新手而言,Django 庞大而全面的功能体系,往往会让人望而生畏。更棘手的是,官方的投票教程2官方文档3的定位更偏向中高级 Web 开发者,而非零基础入门者。

好消息是,Django 采用松耦合设计,各个组件既能独立使用,又能无缝配合,模块化程度极高。换句话说,你完全可以按需学习、按需使用。即便经验丰富的开发者,在实际项目中也只会用到框架的一部分功能,这是因为 Django 功能全面、体量庞大,几乎不可能在一个项目里使用它的全部特性。

不过你会发现,几乎所有 Django 网站都会遵循相似的模式、处理相同的任务:新建与配置项目、连接与查询数据库、编写业务逻辑、完成增删改查(CRUD)、处理用户登录与表单等等。Django 本身并不难学,也不该难学。你能想到的绝大多数场景,Django 都提供了现成的解决方案——这也是文档存在的价值。但即便是文档的主要作者与核心开发者,也不可能记住所有细节,初学者更不必强迫自己做到这一点。

这本书最初只是笔者开发 Django 项目时的个人笔记。笔者花了很长时间,才真正理解并适应 Django 的设计与结构。于笔者而言,巩固知识最好的方式,就是循序渐进地做项目——从简单到复杂,每个项目只聚焦一个新知识点或新技能。后来,笔者把这些笔记整理成一系列博客文章发布。凭借读者的喜爱与支持,笔者将其扩充成书,如今已经更新到第五版

在本书中,我们将从零开始,构建、测试并部署六个难度循序渐进的 Web 应用。从最简单的「Hello, World」起步,最终完成一个功能完整、可直接使用的新闻网站。这个项目会整合全书所有核心知识点,包括模型、视图、URL 配置、模板、表单、用户账户与权限管理等。

学完本书后,你将能够独立从零搭建 Django 项目,并拥有扎实的基础,可以借助更高级的学习资源,进一步完善自己的知识体系。

为什么学习 Django?

Django 最初诞生于 2003 年秋,由《劳伦斯世界日报》的开发团队创建,以传奇爵士吉他手 Django Reinhardt 命名,并于 2005 年 7 月以开源形式正式发布。如今即将走过 20 个年头,在软件行业中早已称得上成熟稳定,却依旧保持着旺盛的生命力,甚至比以往更加活跃。框架每周都会合并数十次代码提交,每月发布安全更新与缺陷修复,每八个月推出一个重要新版本。围绕其建立的庞大的第三方包4生态系统,更为核心框架提供了丰富的功能扩展。

Django 基于简洁优雅、可读性极强的 Python 语言开发,而 Python 如今已是全球最受欢迎的编程语言之一。它是高校计算机专业的主流教学语言,在数据科学与人工智能领域占据主导地位,同时也广泛应用于各类科学研究。Python 简单易用、应用场景极广,几乎能胜任所有开发任务。

Django 继承了 Python 开箱即用的设计理念,内置了 Web 开发中各类常见场景所需的全套功能:

  • 对象关系映射(ORM):无需编写原生 SQL,通过 Python 代码即可完成数据库表的创建与查询
  • 身份验证系统:提供完整且安全的用户账户、用户组、权限管理及基于 Cookie 的会话机制
  • 模板引擎:语法简洁直观,支持变量与逻辑控制,快速生成动态 HTML
  • 表单系统:内置强大的表单库,自动完成表单渲染、数据校验与错误处理
  • URL 路由:设计优雅、结构清晰,便于维护与扩展
  • 管理后台:可视化界面,可直接管理用户、数据及所有数据库内容
  • 国际化支持:支持多语言切换,以及日期、时间、数字与时区的本地化处理
  • 安全防护:内置防御 SQL 注入、XSS、CSRF、点击劫持等常见安全威胁的工具

这样的设计让 Web 开发者可以专注于业务本身的独特价值,无需反复从零造轮子。这些基础功能代码早已历经数百万开发者使用与充分检验,安全性与性能都有可靠保障。

相比之下,以 Flask5 为代表的 Web 框架采用微框架设计理念,只提供构建网页最基础的核心功能。Flask 远比 Django 轻量化,给开发者带来了极高的灵活性,但也随之增加了额外负担。搭建一个实用的 Flask 网站,往往需要引入十几个甚至更多第三方扩展包,而这些包的更新维护、安全性与可靠性都需要开发者自行承担。此外,由于缺乏统一规范,Flask 项目结构千差万别,在不同项目间切换时,很难形成稳定一致的最佳实践。Flask 本身是一款优秀的 Web 框架,只是它与 Django 这类全功能框架在设计定位和优缺点上截然不同。

在资深 Django 开发者中,一直流传着一句名言:“为框架而来,为社区而留”。此言不虚!Django 拥有对所有技术水平开发者都极为热忱、包容的社区:全球各大洲每年都有由志愿者主导运营的 DjangoCon 大会,还有活跃的官方论坛6,以及全球各地城市常态化的线下开发者聚会。与许多由公司或个人维护的开源项目不同,Django 由非营利组织Django 软件基金会7管理,始终以推广、支撑与发展框架为核心使命,董事会成员均由社区每年投票选举产生。

全球已有数百万开发者使用 Django 搭建网站,每年仍有数百万人选择它——毕竟,与其重复造轮子,不如直接依托一众优秀开发者早已夯实的成果,把繁琐的底层工作交给更专业的人。

前置要求

如前所述,学习本书无需任何 Python 或 Web 开发基础。即便你是编程与前端新手,也能跟随教程一步步实操,亲身体验从零搭建 Web 应用的过程。

当然,若提前了解 Python、HTML 与 CSS 基础知识,会更利于你快速理解并巩固核心概念。本书会专门说明 Django 与其他 Web 框架的不同之处,其中最典型的便是 Django 采用的模型-视图-模板(MVT)架构,与主流的模型-视图-控制器(MVC)模式略有差异。这些区别我们会在正式编写代码时详细讲解。

Django 5 的新特性

值得注意的是,Django 的版本发布策略8采用时间驱动而非功能驱动。框架大约每八个月推出一个新功能版本,同时按月按需发布错误修复与安全补丁。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 带来了哪些新特性?其中最重要的改进,便是表单字段渲染得到大幅简化。管理界面新增了分面筛选器,让 UI 筛选更便捷;数据库字段现已支持计算型默认值;同时官方兼容 Python 3.10、3.11 和 3.12。Django 多年来逐步完善异步支持,该版本在身份验证模块中,新增了用于用户认证的异步函数。而对升级开发者来说,最直观的变化是:注销链接必须使用 POST 请求,不再支持 GET 请求

Django 是一款成熟稳定的 Web 框架,始终在坚守稳定性的基础上,紧跟现代 Web 技术的发展步伐。如果你正在维护旧版本的 Django 项目,官方已提供详尽的升级指南9,为版本升级提供全面指导。

本书结构

本书第 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 通用类视图,大幅减少代码量;随后添加表单,并集成内置用户认证系统,实现注册、登录与注销。

本书后半部分将完整开发并部署一个可用于生产环境的新闻网站: 第 9 章演示如何使用自定义用户模型与规范测试新建项目; 第 10 章实现完整的用户认证(登录、注销、注册); 第 11 章引入 Bootstrap 优化前端样式; 第 12 章实现邮件重置密码与修改密码功能; 第 13–15 章添加文章、评论、权限与授权控制; 第 16 章讲解生产环境部署流程。

结语部分会梳理全书核心概念,并提供进阶学习资源。尽管你可能想跳读,但我建议按顺序学习——每一章都会引入新知识点,并在前文基础上层层递进。

读完本书,你将扎实掌握 Django 核心能力,能够独立开发 Web 应用,并为后续学习中高级 Django 技术打下坚实基础。

本书排版

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

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

为了简洁起见,当现有代码没有变化时,我们会使用三个点...表示。代码中发生变化的部分会用# new注释标出:

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

遇到问题怎么办

每个程序员,无论水平高低,都会遇到卡壳的情况。随着你职业生涯的发展,唯一变化的只是问题的难度。成为一名更好的开发者的一部分,就是接受这种挫败感,学会寻求帮助,提出有针对性的问题,以及知道什么时候最好的办法是离开电脑,绕着街区走一圈,让头脑清醒一下。

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

当然,你不能完全相信网上看到的所有内容。随着经验的积累,你会逐渐理解 Django 和代码的各个部分是如何组合在一起的。

如果你在学习本书的过程中遇到了问题该怎么办?首先,仔细对照书中的代码检查你的代码。如果仍然无法解决,可以查看本书的官方源代码10,它托管在 GitHub 上。一个常见的错误是肉眼几乎无法察觉的细微空格差异。如果你怀疑是这个问题,可以尝试复制粘贴官方源代码。

下一步是离开电脑,甚至睡一觉再看问题。当解决问题时,短暂的休息和距离感会给你的大脑带来意想不到的效果。

Django 社区有两个优质的官方交流平台,专为开发者提问、答疑与交流而设:一是 官方 Django 论坛11,二是 Django Users Google 群组12。如需进一步协助,这两处都是非常可靠的求助渠道。

社区

Django 的成功,一半源于框架自身的硬核技术实力,另一半则离不开蓬勃发展的开发者社区。“为框架而来,为社区而留”,早已成为全球 Django 开发者广为流传的共识。 社区深度参与着 Django 的全生命周期建设:开发者通过 django-developers13 邮件列表参与技术迭代,Django 软件基金会14以非营利组织的身份统筹框架发展,一年一度的 DjangoCon 全球大会、遍布各地的线下开发者聚会,为开发者搭建了知识分享与交流碰撞的优质平台。

无论你的技术水平如何,积极融入 Django 社区,都是精进技能、结识同行、提升行业影响力的绝佳途径。

结语

下一章,我们将学习如何配置本地开发环境,并从零创建第一个 Django 项目。让我们正式启程!

脚注

  1. https://djangoproject.com↩︎

  2. https://docs.djangoproject.com/en/5.0/intro/tutorial01/↩︎

  3. https://djangoproject.com/↩︎

  4. https://djangopackages.org/↩︎

  5. https://flask.palletsprojects.com/en/3.0.x/↩︎

  6. https://forum.djangoproject.com/↩︎

  7. https://www.djangoproject.com/foundation/↩︎

  8. https://www.djangoproject.com/download/↩︎

  9. https://docs.djangoproject.com/en/5.0/howto/upgrade-version/↩︎

  10. https://github.com/wsvincent/djangoforbeginners↩︎

  11. https://forum.djangoproject.com/↩︎

  12. https://groups.google.com/g/django-users↩︎

  13. https://docs.djangoproject.com/en/dev/internals/mailing-lists/↩︎

  14. https://www.djangoproject.com/foundation/↩︎