前言

自 2011 年,我从 Java Web 开发转行到 Python Web 开发,到今天已经有 7 年多了。一开始,我就是从 SSH(Structs+Spring+Hibernate)框架转到 Django 的。当时的第一感觉是这玩意儿太轻便了,比 SSH 好用太多了。但熟悉了 Python 社区之后,我发现 Django 已然算是 Python 社区中一个比较重的框架了。说它重的主要原因在于它的定位是企业级开发框架,或者说全功能的 Web开发框架,也因为它“通过更少的代码,更快速地开发 Web 应用”的口号。

在使用 Django 的几年中,我和同事们做了 N 多个系统,有对内的,比如 CAS 权限管理后台、新闻系统后台、电影内容系统后台、游戏内容管理后台、投票系统后台和运营相关系统等;也有对外的,比如游戏中心 H5 Web 版、用户留言系统、H5 活动页系统和交易相关系统等。

我们开发过的所有系统,无论是从开发速度还是上线后新功能的迭代,Django 都能很好地满足需求。所以我就在考虑,能不能总结出来一些对大家有帮助的东西,主要面向想学习 Django但又无从下手,或者看了很久文档,虽能完成新手教程,但想自己开发一套系统时却无从下手的人。这就是我写这本书的第一个原因。

第二个原因是,我从 Java 转到 Python 之后,是通过 The Django Book 一书的在线翻译版学习Django 的。对于快速学习来说,中文版无疑是最好的选择。当时 Django 的版本是 1.3,而那本书使用的版本是 1.1。虽说当时 Django 1.1 没有太大的版本差异,但是时至今日,Django 的最新版本已经是 2.0 了,整体结构以及功能都有了很大的变化,我发现依然有人在看那本书入门。因此,应该有新的教程出现,帮助初学者快速入门。

第三个原因是,我在 2012 年很幸运地通过了面试,从小公司跳槽到搜狐,但入职第一年的工作内容让我意识到在上家公司一年左右使用 Django 的经历并没有给我增加太多实战经验。我在 2012 年的年终总结里写道:

主要是因为之前的工作都是开发阶段的,用的也都是 Django 的皮毛,对部署和环境配置等都没有概念。

所以我希望为那些刚开始学习 Django 的人提供比较完整的内容,并且这些内容是从实际工作中总结出来的。

基于上述三个原因,也就有了这本书和之前录过的一套视频(https://st.h5.xiaoe-tech.com/st/ 57fHzIRWE)。希望我的经验对你有所帮助,使你不至于在使用了 Django 一年后还处于我当时的状态。

谁应该来读这本书

本书面向所有对 Python Web 开发感兴趣的人,无论你是刚开始学习编程的学生,还是刚入职场的程序员,抑或是有多年编程经验、打算转换自己技能栈的老程序员。

本书的目标读者概括如下:

□ 学完 Python 基础、想要继续学习 Web 开发的人;

□想要使用 Django 快速开发日常业务系统(商业 Web 项目、自动化运维系统等)的人;

□有其他语言 Web 开发经验、想要转到 Python Web 开发的人。

哪些公司或产品在使用 Django

基于 Django 开发的比较有名的产品在 https://www.djangoproject.com/start/overview/ 上可以看到,其中有很多我们耳熟能详的产品,比如 Instagram、Disqus、Pinterest、Mozilla、Sentry 和 Open Stack 等。

国内使用 Django 的公司或产品有搜狐、奇虎 360、豆瓣、今日头条、妙手医生、闪银奇异、蚂蚁金服等。

生态

Django 之所以被广泛应用,除了本身提供了完备的功能之外,也得益于它的成熟生态。这一框架本身没有覆盖到的功能,一般都会有优秀的第三方插件来补足,比如用来做 RESTful 接口的django-rest-framework、用来调试性能的 django-debug-toolbar 和用来搜索的 django-haystack 等。更多的第三方插件,可以在 https://djangopackages.org/上查看。

学习曲线

相对于 Flask、web.py 和 Bottle 这一类微型框架来说,Django 上手确实有点复杂,但也并不难,因为官网的新手指导写得很清晰。在众多框架中,Django 的文档算是相当优秀和完整的了。

你需要花费更多的时间来学习 Django,这是因为它提供的内容远多于其他框架。刚开始,可能会觉得很多地方不明白,但是等你熟悉了之后就会发现,在 Web 应用开发上,Django 已经提供了很完备的支持,比如登录认证、权限管理、admin 管理后台、缓存系统、常见的 Web 安全防御等。Django 每一层或者模块所提供的功能都很清晰,比如什么样的需求在哪一层来处理,或者在哪个模块中处理。

Django 一开始的学习曲线有点陡,然后是平缓上升的。先陡主要是因为新手需要一下子接受很多东西,但是随着后面不断使用和了解,你会发现,学习所耗费的时间完全值得。你可以更快地做出完善的系统,这会是一笔很划算的投资。

本书目的

本书的初衷前面也提到了,就是把我知道的关于软件开发的知识、实际项目开发中总结到的经验,以一个 Blog 系统为例写出来,让后来者可以参考我的经验快速成长,同时也可以搭建出自己的试验场。

本书内容

本书共分为四部分,分别为:初入江湖、正式开发、第三方插件的使用、上线前的准备及线上问题排查。

每一部分着重介绍一个大的主题:第一部分介绍正式进入编码之前的一些工作;第二部分在第一部分的基础上开始实现需求,进行编码,直到完成需求;第三部分重点介绍我们常用的第三方插件,如 xadmin、django-autocomplete-light 和 django-rest-framework 等;最后一部分介绍调试、优化、自动化部署以及压力测试等内容。

每一部分中的每一章专注介绍一个比较小的主题,像第 5 章主要介绍模型中涉及的内容,比如各种字段的介绍、QuerySet的使用和优化以及 ORM的概念等。

每一章的内容完成后,代码都可以正常运行,这样你可以快速看到运行结果。此外,每一章也都是基于前一章的结果来进行开发的。

本书对应的源码①放在 https://github.com/the5fire/typeidea,其中每一个分支对应每一章最后的源码。比如,第 5 章的源码是 book/05-initproject 分支下的代码,其他的以此类推。

即使 GitHub 上提供了源码,本书还是呈现出了完整的代码,建议读者根据内容进行编写,同时也要注意书中提到的一些需要自己独立完成的作业。

为什么选择一个 Blog 系统

选择写一个 Blog 系统,是因为绝大部分人对这个系统/业务都很熟悉。实际上,在工作中我们经常需要开发一些从来没接触过的业务,所以把业务落地(从开发到部署上线)比起曾经开发过什么系统更为重要。

这里选择一个大家都熟悉的业务,是为了降低大家理解业务的难度。用一句话来说的话,那就是:降低学习 Django 时的心智负担。

① 本书源码也可从图灵社区(iTuring.cn)本书主页免费注册下载。

“理解”这个词很重要。无论是设计语言、设计框架、设计项目结构,还是设计产品流程,都需要重视这个词。此外,也需要注意降低用户(团队)的心智负担。关于“心智负担”这个词,这里不再做过多解释,只强调一点:对于正式项目开发来说,降低开发人员维护代码时的心智负担,就是减少复杂度、降低风险的方式。

另外一个原因前面也提到过,每个开发者都需要有自己的“试验场”,这个观点我在书中也会多次提到。技术的世界变化非常快,比方说今天我在公司项目的技术选型上使用了 Django 1.11,那意味着在后续的维护过程中不太可能会升级到 Django 2.0 或者更高的版本。因为在成本上不允许这么做,但你会因此就放弃对新技术的追求和实践吗?当然不会,我们可以通过其他方式来获得新技术的实践经验,进而在某个时刻把这些经验引入到商业项目中来。

所以,即便现在有各种博客平台和公众号平台供你写下自己的技术总结、思考,你可能也需要一个能够随时实践新技术的“试验场”,来让你获得工作之外的经验点。

致谢

感谢我的父母,没有他们,也就没有我。

感谢搜狐,我在这个平台上学会了很多,收获了很多。

感谢一起共事过的同事们,跟你们一起编码、讨论的经历,催生了这本书。

感谢 Adrian Holovaty 和 Simon Willison 创造了这个优秀的框架。

感谢尹吉峰、董伟明、李者璈(Manjusaka)对本书的审校、建议和短评,让我能进一步完善本书内容。

特别感谢大妈(Zoom.Quiet)和清风老师给本书写推荐序,感谢他们给我提的各种建议(关于图书编写、编程规范、编码细节等非常实用的建议)。也非常感激大妈 2012 年组织的 BPUG,会上清风老师和其他众位前辈的分享对当时刚转入 Python 开发的我来说影响重大。

最后,感谢我的爱人和女儿。没有我爱人的支持以及对我和女儿的细心照料,我就不会有时间来完成工作之外的其他兴趣(如写书、写博客、录视频等)。感谢我的女儿给我带来不一样的世界,她每一天的成长都是肉眼可见的。对我而言,她的学习能力是我需要借鉴的,这不断督促我去学习更多新东西。她的成长是对时间很好的展现,这让我对时间有了更直观和深刻的认识。

勘误和反馈

鉴于我的经历和视野有限,书中错误之处在所难免,敬请读者指正。欢迎到 GitHub 上给我提问题,网址是 https://github.com/the5fire/django-practice-book,或者发邮件到我的邮箱 thefivefire@ gmail.com(注明:《Django 企业开发实战》勘误),这里先行谢过。

如果你对本书的内容或者组织方式有任何疑问,也欢迎到我的博客(https://www.the5fire.com)上或者通过微信公众号(Python 程序员杂谈)给我留言。

图像说明文字

目录

  • 序一
  • 序二
  • 前言
  • 第一部分 初入江湖
  • 第1章 需求
  • 第2章 框架基础和技术选型
  • 第3章 Django小试牛刀
  • 第二部分 正式开发
  • 第4章 进入开发
  • 第5章 奠定项目基石:Model
  • 第6章 开发管理后台
  • 第7章 开发面向用户的界面
  • 第8章 引入前端样式框架Bootstrap
  • 第9章 完成整个博客系统
  • 第三部分 第三方插件的使用
  • 第10章 使用第三方插件增强管理后台
  • 第11章 使用django-rest-framework
  • 第四部分 上线前的准备及线上问题排查
  • 第12章 调试和优化
  • 第13章 配置MySQL和缓存
  • 第14章 上线前的准备
  • 第15章 升级到Django 2.0
  • 第16章 最后总结
  • 附录A 使用Fabric 2.0
  • 附录B 使用uWSGI来启动Django程序
  • 附录C Sentry安装和配置
  • 附录D 评论验证码功能 
  • 附录E 通过signal来解耦代码
  • 附录F 实现文章置顶的几种方案
  • 附录G 以腾讯云为例演示部署流程