Django简介


Django简介

Django是一个开放源代码的Web应用框架,使用Python语言编写完成。

Web框架是一套组件,提供通用的设计模式,能够最大程度地降低开发Web站点的难度。

Django的设计目标就是使开发复杂的、数据库驱动的网站变得简单,注重组件的可重用性与可插拔性。

1.1 Django的产生背景

1.1.1 Django的创建背景

假设现在没有Django,我们要开发一个Web站点,需要做哪些工作,写哪些组件去完成它呢?通常需要做下面的几件事。

(1)构建用户账户体系,实现Web站点的登录与注册功能。

(2)定义数据表模型及实现访问功能。

(3)编写业务逻辑实现站点功能。

(4)实现后台管理功能。

(5)路由模型实现功能请求映射。

以上这些就是实现一个基本的Web站点需要做的工作。A站点做完之后,我们可能还需要去做B站点,但是,通常不同的站点只是步骤(3)的业务逻辑不同,其他的功能需求是类似的,甚至是完全一样的。那么能不能把通用的组件或者模块组合在一起,提供给开发Web站点的人使用呢?后来就出现了Web框架的概念,这就是Django产生的根本原因。

Django最初是被开发用来管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。2003年秋天,Lawrence Journal-World报社的Web开发者艾德里安·胡卢瓦提(AdrianHolovaty)和西蒙·威利森(Simon Willison)开始使用Python语言去构建应用,他们所在的World Online小组搭建并维护当地的几个新闻站点。新闻界的快节奏促使团队不断提高其产品开发速度,于是Simon和Adrian想办法构建出一个能够节省开发时间的框架,将可重用的组件组合在一起,不必做重复的工作,就这样,Django诞生了。之后,World Online小组的成员雅各布·卡普兰-莫斯(Jacob Kaplan-Moss)将这个框架发布为一个开源软件。经过数年发展,Django有了数以万计的用户和贡献者,现在的Django毫无疑问已经成为Python开发中最流行的Web框架。

1.1.2 Django的版本发布过程

Django遵守BSD(Berkeley Software Distribution,伯克利软件发行版)版权,初次发布于2005年7月,并于2008年9月发布了第一个正式版本1.0。从正式版1.0之后,Django的版本发布过程如下。

(1)功能版本:版本号定义为A.B、A.B+1等,大约每8个月发布一次,每个版本均包括新功能以及对现有功能的改进。

(2)补丁版本:版本号定义为A.B.C、A.B.C+1等,用来修复bug或者是安全问题,补丁版本是100%兼容相关的功能版本的,所以,除了由于安全问题或者是可能造成数据丢失的情况之外,都应该升级到最新的补丁版本。

(3)LTS版本:即长期支持的版本,某些功能版本会被指定为LTS版本,如1.8LTS版本,这类版本的安全更新时长至少需要3年。值得注意的是,Django最后一个支持Python 2.7的版本是1.11LTS,如果想使用最新版本的话,需要选择Python 3。

1.1.3 MVC设计模式

Web服务器开发领域里有着著名的MVC设计模式:

数据存取逻辑、业务逻辑和表现逻辑。

把它们3个组合在一起的时候,就构成了Model-View-Controller(MVC)。

  • Model代表的是数据存取层,是对数据实体的定义和对数据的增删改查操作;

  • View代表的是视图层,即系统中选择显示什么和怎么显示的部分;

  • Controller代表的是控制层,它负责根据从View中输入的指令检索Model中的数据,再以一定的逻辑产生最终的结果输出。

image-20211220115653669

MVC的3层之间紧密相连,但是又相互独立。每一层的修改都不会影响其他层,每一层都提供了各自独立的接口供其他层调用,这种模块化的开发极大地降低了代码之间的耦合,也增加了模块的可重用性。

1.1.4 Django的MTV设计模式

Django框架的设计模式借鉴了经典的MVC思想,将交互过程分成了3层,主要目的是降低各个模块之间的耦合。Django框架将交互过程拆分为Model(模型)、Template(模板)和View(视图),即MTV设计模式,主要包括以下内容。

  • (1)M(Model):数据存取层,这一层处理所有与数据相关的事务,提供在数据库中管理(添加、修改、删除)和查询记录的机制。
  • (2)T(Template):表现层,处理页面的显示,即所有与表现相关的决定都由这一层去处理。
  • (3)V(View):业务逻辑层,负责处理业务逻辑,会在适当的时候将Model与Template组合在一起,通常被认为是联通M与T的桥梁。从概念上可以看出,Django也是一个MVC框架,但是在Django中,C(Controller)是由框架自行处理的,它由框架的URLConf来实现,其机制是使用正则表达式匹配URL,再去调用合适的Python函数。所以,Django更关心的是M、T和V。

image-20211220140125682

1.1.5 Django中的ORM

ORM(Object Relational Mapping,对象关系映射)把对象与数据库中的表关联起来,对象的属性映射到表的各个字段,同时,还把对表的操作对应到对对象的操作,实现了对象到SQL、SQL到对象的过程转换。

Django为ORM提供了强大的支持,适配了多种常用的数据库,如PostgreSQL、MySQL、Oracle等。Django把表模型定义为Model,其定义过程非常简单,只需要继承自django.db.models中的Model类就可以了,Model类中的每一个属性都能映射到表的对应字段。

2.安装Django

Django在BSD许可证下是开源的。建议使用最新版本的 Python 3。最后一个支持Python 2.7的版本是Django 1.11 LTS。

2.1版本

Django 版本 Python 版本
2.2 3.5,3.6,3.7,3.8(2.2.8 添加),3.9(2.2.17 添加)
3.0 3.6,3.7,3.8,3.9 (3.0.11 添加)
3.1 3.6,3.7,3.8,3.9(3.1.3 添加)
3.2 3.6, 3.7, 3.8, 3.9, 3.10 (在 3.2.9 中就已经加入了)
4.0 3.8, 3.9, 3.10

对于每个版本的Python,官方仅支持最新的三级版本(A.B.C)。你可以在 Python下载页面 找到每个系列的微版本。

一般来说,我们会支持一个 Python 版本直到其第一个发布的 Django LTS 安全支持停止。而 Django LTS 版本安全支持停止是跟随这其对应版本的 Python 安全支持结束的。例如,Python 3.3 安全支持在 2017 年 9 月结束,然后 Django 1.8 LTS 安全支持在 2018 年 4 月结束。因此 Django 1.8 是支持 Python 3.3 的最后一版。

选项 1:获取最新的正式版本

最新(2021-12)的官方版本是4.0,然后使用pip进行安装:

pip install Django==4.0
>>> import django
>>> print(django.get_version())
4.0

选项 2:获取最新的开发版本

最新的Django版本是在https://github.com/django/存储库中的版本。

git clone https://github.com/django/django.git

因为新版本的 Python 通常会更快,拥有更多特性,而且有更好的支持,推荐使用 Python 3 的最新版本。

使用旧版本的 Django 不会损失任何东西,但你不能利用新版本的 Python 的改进和优化。与 Django 一起使用的第三方应用程序可以自由设置自己的版本要求。

一般来说,如果你在生产中使用 Django,你应该使用稳定版本。Django 每 9 个月发布一次稳定版本,之后会间断发布修复补丁的版本。这些稳定版本包含的 API 都是向后兼容的;如果你是按照稳定版本来进行编写代码,那你在下一个正式版本升级的时候不应该出现问题。

release-roadmap.3c7ece4f31b3

3. Django与WSGI

在Python中,很多Web应用框架都支持WSGI(Web ServerGateway Interface),比如Django、Flask、Tornado和Bottle,等等。

WSGI是Web服务器网关接口,这是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口协议,它是将Web服务器(例如Apache或Nginx)的请求转发到后端Python Web应用程序或Web框架。

简单来说,Django是一个Web应用框架,WSGI是定义Web应用框架和Web服务器的通信协议。一个完整的网站必须包含Web服务器、Web应用框架和数据库。

用户通过浏览器访问网址的时候,这个访问操作相当于向网站发送一个HTTP请求,网站首先由Web服务器接受用户的HTTP请求,然后Web服务器通过WSGI将请求转发到Web应用框架进行处理,并得出处理结果,Web应用框架通过WSGI将处理结果返回给Web服务器,最后由Web服务器将处理结果返回到用户的浏览器,用户即可看到相应的网页内容

image-20211220144646865

WSGI分为两部分:服务端和应用端,服务端也可以称为网关端(即uWSGI或Gunicorn),应用端也称为框架端(即Django或Flask的Web应用框架)。我们知道WSGI是Web服务器(即Apache或Nginx)与Web应用框架的(即Django或Flask的Web应用框架)的通信规范,它没有具体的实现过程,因此由服务端(即uWSGI或Gunicorn)实现通信过程。换句话说,服务端实现服务器和Web应用框架的通信传输,根据实际的网站搭建情况,我们将网站架构分为两级架构和三级架构。

image-20211220144716827

两级架构是将服务端(即uWSGI或Gunicorn)作为Web服务器,许多Web框架已经附带了WSGI的服务端,比如Django和Flask,因此它们能直接运行启动,但这种架构模式只能在开发阶段使用,在上线阶段是无法适用的,因为服务端性能比不上专业Web服务器(即Apache或Nginx)。三级架构是将服务端作为中间件,实现Web服务器和Web应用架构的通信,这种架构模式用于上线阶段。

4. 创建Django项目

创建Django项目可以在终端输入指令完成,也可以在PyCharm里创建项目,前者是通过Django内置的指令实现,后者是在PyCharm的可视化界面完成。

这里使用Django内置的指令创建项目。

django-admin startproject mysite

让我们看看 startproject 创建了些什么:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

这些目录和文件的用处是:

  • 最外层的 mysite/ 根目录只是你项目的容器, 根目录名称对 Django 没有影响,你可以将它重命名为任何你喜欢的名称。

  • manage.py: 一个让你用各种方式管理 Django 项目的命令行工具。你可以阅读 django-admin 和 manage.py 获取所有 manage.py 的细节。

  • 里面一层的 mysite/ 目录包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。 (比如 mysite.urls).

  • mysite/__init__.py:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。如果你是 Python 初学者,阅读官方文档中的 更多关于包的知识

  • mysite/settings.py:Django 项目的配置文件。如果你想知道这个文件是如何工作的,请查看 Django 配置 了解细节。

  • mysite/urls.py:Django 项目的 URL 声明,就像你网站的“目录”。阅读 URL调度器 文档来获取更多关于 URL 的内容。

  • mysite/asgi.py:作为你的项目的运行在 ASGI 兼容的 Web 服务器上的入口。阅读 如何使用 ASGI 来部署 了解更多细节。

  • mysite/wsgi.py:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。阅读 如何使用 WSGI 进行部署 了解更多细节。

    ​ 从Django 3.0开始,新建的项目都会创建asgi.py文件,这是将异步通信服务纳入Django的内置功能,也是Django 3.0的新特性之一。ASGI是异步网关协议接口,一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型,包括HTTP、HTTP2和WebSocket。

用于开发的简易服务器

让我们来确认一下你的 Django 项目是否真的创建成功了。如果你的当前目录不是外层的 mysite 目录的话,请切换到此目录,然后运行下面的命令:

$ python manage.py runserver

你应该会看到如下输出:

Performing system checks...

System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.

十二月 17, 2021 - 15:50:53
Django version 4.0, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

image-20211220150107853

更换端口

默认情况下,runserver 命令会将服务器设置为监听本机内部 IP 的 8000 端口。

如果你想更换服务器的监听端口,请使用命令行参数。举个例子,下面的命令会使服务器监听 8080 端口:

$ python manage.py runserver 8080

如果你想要修改服务器监听的IP,在端口之前输入新的。比如,为了监听所有服务器的公开IP(这你运行 Vagrant 或想要向网络上的其它电脑展示你的成果时很有用),使用:

$ python manage.py runserver 0:8000

00.0.0.0 的简写。完整的关于开发服务器的文档可以在 :djamdin:runserver 参考文档中找到。

完成项目的创建后,接着创建项目应用,项目应用简称为App,相当于网站功能,每个App代表网站的一个功能。App的创建由文件manage.py实现,创建指令如下:

python.exe manage.py  startapp  index

项目新建了index文件夹,其可作为网站首页。在index文件夹中可以看到有多个.py文件和migrations文件夹,说明如下:

  • migrations:用于生成数据迁移文件,通过数据迁移文件可自动在数据库里生成相应的数据表。
  • __init__.py:index文件夹的初始化文件。
  • admin.py:用于设置当前App的后台管理功能。
  • apps.py:当前App的配置信息,在Django 1.9版本后自动生成,一般情况下无须修改。
  • models.py:定义数据库的映射类,每个类可以关联一张数据表,实现数据持久化,即MTV里面的模型(Model)。
  • tests.py:自动化测试的模块,用于实现单元测试。
  • views.py:视图文件,处理功能的业务逻辑,即MTV里面的视图(Views)。

如果使用PyCharm调试Django开发的项目,PyCharm的版本必须为专业版,而社区版是不具备Web开发功能的