跳到主要内容

Django 框架简介

图片描述

你好,欢迎来到这门《Django 框架》教程,这个教程会带你学习 Python 著名的 Web 开发框架 Django。这节课我们会详细介绍 Django 框架的发展历程以及 Django 框架的优缺点,并对其他 Web 开发框架做一个简单的对比。有的同学可能只学习了基础语法,对框架的概念不太了解,不用担心,你可以先看一下这篇文章,对 Django 框架有一个大致的了解,后面的小节我们对 “什么是框架?” 做了详细的阐述。

1. MVC 与 MTV 介绍

在 Web 框架中,架构模式是其一个重要的特点,往往一个 Web 框架会在设计之初选定好一种架构模式,然后开始该模式设计和编写相关代码,而 Django 则是基于 MTV 架构的模式 。

另一种流行的架构模式为 MVC,它在 Java Web 框架中非常流行。MVC 全称 Model View Controller,即模型 - 视图 - 控制器。MTV 的全称是 Model Templates View,即模型 - 模板 - 视图。MTV 中的名词解释如下:

  • 模型:在程序中用于处理数据逻辑的部分,大部分情况下是对数据库的增删改查的操作;
  • 视图:该层包含存取模型及调取恰当模板的相关逻辑。用于封装负责处理用户请求及返回响应的逻辑;
  • 模板 :用于处理用户显示部分的内容,和 MVC 中的 V 是一样的,通过 HTML 展示。它使用模板方法可以动态地生成 HTML。模板包含所需 HTML 输出的静态部分,以及一些特殊的语法,描述如何将动态内容插入。

MTV 和 MVC 模式并没有本质上的区别,都是为了实现应用的解耦,只是定义上有些不同。在 MTV 模式的 Web 框架中,没有 Controll 层,这个是由框架内部实现,我们需要做的就是将 URL 对应到视图即可,通过这样的 URL 配置,系统将一个请求发送到一个合适的视图进行处理。在 Django 框架中就实现了这样一个 URL 分发器,它帮助分发 URL 请求到对应的视图。

2. Django 框架介绍

首先来看看 Django 诞生的过程:

Django 是从真实世界的应用中成长起来的,它是由堪萨斯(Kansas)州 Lawrence 城中的一个 网络开发小组编写的。 它诞生于 2003 年秋天,那时 Lawrence Journal-World 报纸的程序员 Adrian Holovaty 和 Simon Willison 开始用 Python 来编写程序。当时他们的 World Online 小组制作并维护当地的几个新闻站点,并在以新闻界特有的快节奏开发环境中逐渐发展。这些站点包括有 LJWorld.comLawrence.comKUsports.com, 记者(或管理层) 要求增加的特征或整个程序都能在计划时间内快速地被建立,这些时间通常只有几天或几个小时。 因此,Adrian 和 Simon 开发了一种节省时间的网络程序开发框架, 这是在截止时间前能完成程序的唯一途径。2005 年的夏天,当这个框架开发完成时,它已经用来制作了很多个 World Online 的站点。 当时 World Online 小组中的 Jacob Kaplan-Moss 决定把这个框架发布为一个开源软件,于是 Django 正式出现在大众眼前,并且得到了快速发展,原来的 World Online 的两个开发者(Adrian and Jacob)仍然掌握着 Django,但是其发展方向受社区团队的影响更大。

Django 基于 MTV 模式,其框架示意图如下:

图片描述

Django 框架图示 Django 框架的核心组件有

  • 用于创建模型的对象关系映射(ORM);
  • 基于正则表达式的 URL 分发器;
  • 视图系统,用于处理 URL 请求;
  • 模板系统,用于将模板文件转换成 HTML 文件,并在浏览器上显示;
  • 缓存系统,并提供多种缓存方式。

除此之外 Django 框架中还包括如下功能

  • 轻量级的、独立的 Web 服务器,用于开发和测试;
  • 表单序列化及验证系统 (Form),用于 HTML 表单和数据库存储的数据之间的转换;
  • 中间过滤组件,允许对请求处理的各个阶段进行干涉;
  • 序列化系统,能够生成或读取采用 XMLJSON 表示的 Django 模型实例。

此外,Django 还内置了许多有用的应用,比如一个可扩展的认证系统、动态站点管理页面等等。Django 前身就是在线新闻站点,因此它是非常适合做 Web 站点开发的。

3. Django 的主要版本

到目前为止,Django 已经经历了三个大的版本,迭代速度之快,令人不得不佩服。不过目前最新的 3.0 版本于 19 年 12 月发布,还处于快速迭代中,不推荐一开始生产环境就使用 3.0。下面我们简单介绍下 Django 的 1.0 和 2.0 版本之间的主要差别:

支持的 Python 版本:这大概是 Django 1.0 和 2.0 之间一个最明显的差别了。参考访问文档,如下:

Django versionPython version
1.112.7, 3.4, 3.5, 3.6, 3.7 (added in 1.11.17)
2.03.4, 3.5, 3.6, 3.7
2.13.5, 3.6, 3.7
2.23.5, 3.6, 3.7, 3.8 (added in 2.2.8)

可以看到,Django 2.0 之后不再支持 Python 2,甚至 Python 3 的低版本。目前来看,Python 3 已经成了主流,也希望初学者一开始就使用 Python 3 进行编程,不用再纠结使用 Python 2 还是 Python 3。

  • Django 2 相比 Django 1 简化了 URL 路由语法 以及移动友好的 contrib.admin
  • 当然,更多的是模块功能代码上的优化和调整,更多变动细节可以参考这个地址

最后,我们来看看新发布的 Django 3.0 相比 Django 2.0 又有哪些新特点呢

  • 支持 MariaDB Django 现在官方支持 MariaDB 10.1 及以上版本;
  • 支持 ASGI Django 3.0 已经完全支持 async 应用了,并提供了部署异步应用的说明
  • 在 PostgreSQL 上支持 ExclusionConstraint;
  • Filter 表达式;
  • model field 的 choices 属性现在支持自定义枚举类型;
  • 一些小变更,就不一一列举了,大家可以参考官方的 release 信息。

总而言之,Django 1.0 已经逐渐退出历史舞台,2.0 版本是主流,3.0 则是未来。

4. Django 框架优缺点

Django 框架作为一个流行的 Web 框架,其优势如下

  • 功能完善,文档手册丰富,可以说是应有尽有。而且自带大量常用工具和底层封装;
  • 强大的数据库访问组件:开发者可以无差别使用各种数据库,如 SQLite、MySQL 和 oracle 等几乎所有的主流数据库;
  • 灵活的 URL 映射:Django 使用正则表达式管理 URL 映射,灵活性高
  • 丰富的 Template 模板语言:类似 jinjia 模板语言,不但原生功能丰富,还可以自定义模板标签;
  • 自带后台管理系统 admin:只需要通过简单的几行配置和代码就可以实现一个完整的后台数据管理控制平台;
  • 完整的错误信息提示:在开发调试过程中如果出现运行错误或者异常,Django 可以提供非常完整的错误信息帮助定位问题;
  • 丰富的 Django 插件市场:基于 Django 开发的第三方插件众多,简化站点开发的方方面面,比如实现更为强大的认证系统、更为优雅的 API 接口设计、更为精准的调试插件等等。典型代表有 Django Rest Framework 等;
  • 代码开源,社区活跃度高:遇到问题可以在社区求助或者直接学习源码定位问题。

但是作为一个大而全的 Web 框架,它的缺点也是十分明显的

  • 框架庞大,不够精简、捆绑的内容太多。Flask 正好相反,它是一个精简的微服务框架,除了 Flask 核心之外,几乎没有什么额外的代码。正是捆绑的东西太多,封装过度导致 Django 内部模块之间相互关联,耦合度高,不利于改造;
  • Django 在异步通信方面做得不好。最近发布的 3.0 版本中似乎加入了异步通信功能,但仍然处于初级开发阶段。相比之下 Tornado 框架是异步通信功能做得最好的,通常被称为高性能的 Web 框架。

5. 其他的 Python Web 框架介绍

5.1 Flask

和 Django 直接竞争的 Web 框架莫过于 FlaskTornado 了。Flask 是除了 Django 之外另一个流行的 Python Web 框架。Flask 的设计哲学和 Django 恰恰相反,它不会替开发者做选择,有且只有一个核心的模块,因此没有过多的额外功能。

Flask 可以被称为一个微框架,服务的更多功能会由开发者自行选择的插件提供。因此,Flask 的强大第三方市场也使得其与 Django 能在正面上产生竞争。其在 GitHub 上的关注度和社区活跃度与 Django 类似,这也表明越来越多的开发者正在关注着 Flask。Flask 起步比较晚,社区和生态不如 Django 那样完善,此外它不如 Django 那样对初学者友好,学习成本相比 Django 要高。

5.2 Tornado

Tornado 与现代主流的 Web 服务器框架有着明显的区别:它是非阻塞式的服务器,速度相当快。这得益于其非阻塞的方式和对 epoll 的运用。Tornado 可以处理数以千计的连接,对于实时 Web 来说 Tornado 确实是一个理想的 Web 框架。但是 Tornado 只适合特定场景的 Web 开发, 它没有 ORM,也没有 Session 支持,框架中复用的模块非常少,因此用它开发 Web 服务时,很多功能需要自己定制和编写,开发速度会比较慢,使用成本高。

6. 本课程学习基础

本课程的学习除了介绍 Django 框架的基本使用外,后面很多时候我会带领大家进入 Django 框架的源码进行学习,Django 框架的源码其实并不是非常复杂,有时候也会有写的很简单的部分,我会尽量简化代码带领大家更深入地学习 Django 框架。因此,为了学好这门课程,我们需要掌握以下几个基础知识:

  • 前端基础:包括 HTML/CSSJS 代码写的会比较少,但是作为一个 Web 服务开发者,JS 基础是必要的;
  • Python 基础:掌握基本的 Python 编程知识,然后深入了解一些关于魔法函数的知识,这在 Django 的源码中会经常用到;
  • 英文基础:官网文档对 Django 有着非常详细的描述,几乎所有的教材、专栏以及个人写的博客,包括本专栏都会大量参考官方文档,这是最权威的 Django 资料。希望本课程学习完毕后,你也能继续到官方网站上继续学习并阅读最新的手册。只有不断地学习,不断地翻看和调试源码,不断实践,最后才能成为精通 Django 的开发者。

7. 小结

本小节中,我们详细介绍了 Django 框架以及其提供的功能,然后对比分析 Django 框架的优缺点。最后介绍了其他的 Python Web 框架并同 Django 进行了对比。