第2章 初识Django

Django由美国堪萨斯州劳伦斯市的一个Web开发团队用Python写成,是一个开放源代码的Web应用框架。Django主要用于简便、快速地开发数据库驱动的网站,它主要有以下特点。

●Django采用了MTV设计模式,即模型Model、模板Template和视图View。

●Django强调代码复用,注重组件的重用性和“可插拔性”,注重敏捷开发和DRY(Don't Repeat Yourself)法则。

●Django有许多功能强大的第三方插件,具有很强的可扩展性。

●Django使开发复杂的、数据库驱动的网站变得简单。

本章首先介绍Django的安装,然后介绍Django的一些基本知识,最后讲解Django开发基本流程。

2.1 Django安装

大多数程序员在开发过程中使用Windows,不管程序将来是部署在Windows上,还是Linux上,在开发阶段,大家还是习惯在Windows上进行开发、测试,因此本节将主要介绍Django在Windows上的开发环境配置。

Django完全依赖Python环境,而且由于Django版本、模块、插件多且复杂,有时还需要在虚拟环境中进行开发。因此常规安装有3步:第一步是安装Python,第二步是安装Python虚拟环境,第三步是安装Django。

2.1.1 安装Python

Python 是一个跨平台的语言,在各种操作系统上都能使用,而且在某个操作系统上开发的Python程序,在其他操作系统上也能运行,这里我们主要讲解在Windows上的Python安装。

Python安装环境一般要求Windows 7以上版本,安装时需要确定计算机上的Windows是64位还是32位,然后访问Python官方网站,单击Download Python 3.x.x按钮,进入下载页面,选择与操作系统相匹配的安装程序。下载完成后,双击安装程序文件就开始安装了。安装过程与其他软件安装过程相似,要注意的是选择自定义安装,并选中“Add Python 3.x to PATH”,安装结束后,在命令行终端输入命令python,如果出现以下字符,说明安装成功。

            Microsoft Windows [版本 6.1.7601]
            版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
            C:\Users\Administrator>python
            Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)]
                    on win32
            Type "help", "copyright", "credits" or "license" for more information.
            >>>
  

2.1.2 安装Python虚拟环境

在软件开发与运行时,每个程序都要依赖某些软件环境,依赖各种操作系统设置,如环境变量、软件版本等。如果在开发某个新软件时,修改了其他软件依赖的环境,可能导致其他软件无法运行。例如,你以前用Django 1.10开发了一些软件项目,后来又用Django 2.1.2进行开发,如果删除Django 1.10,可能导致原来开发的项目无法运行。如果你既想让原来项目在Django 1.10中运行,又想让新项目在Django 2.1.2上正常运行,只有通过建立Python虚拟环境来解决这个问题。虚拟环境能帮我们从操作系统的Python环境中复制一个全新的Python环境出来,同时这个环境独立于原来的环境。

安装Python虚拟环境非常简单,在命令行终端输入以下命令。

pip install virtualenv

然后等待软件下载完成后开始安装配置,这些过程都是自动进行的。

提示:pip是Python的软件包管理工具,是Python自带的工具软件。

安装好virtualenv之后,输入下述命令创建一个虚拟环境。

virtualenv newenv_dir

newenv_dir是虚拟环境的目录,运行以上命令后,会在当前目录下生成一个newenv_dir目录。

虚拟环境已经创建好了,在命令行终端进入newev_dir目录,再到Scripts文件夹下,运行activate程序激活虚拟环境。

activate

你会发现命令提示符变了,如下所示。

(newenv_dir) E:\newev_dir\Scripts>

命令提示符的开头(newenv_dir)是提示正在虚拟环境中。虚拟环境激活后,它与其他软件环境是隔离开的,因此开发程序时不会影响系统中的其他软件,这样你就可以安装其他版本的Django或者其他软件,开始新的软件开发、测试等工作。

2.1.3 安装Django

安装Django非常简单,在命令行终端输入以下命令,等待安装自动完成。

pip install django

也可以指定安装版本,如下所示,本书中我们指定用Django 2.1.4进行开发。

pip install django==2.1.4

如果在激活的虚拟环境中安装,那么这些版本的Django也只在虚拟环境中运行,不会影响其他软件,也不会与其他版本Django冲突。

提示:如果退出虚拟环境,在虚拟环境中安装的软件、配置的环境是不能用的,它们像不存在一样。

2.1.4 测试安装效果

如果是在虚拟环境中安装的Django,请先激活虚拟环境,再执行命令。如果未在虚拟环境中安装,则直接执行命令。在命令行终端输入python命令,启动Python交互式解释器,试着用import django导入Django,如下所示。

            E:\envs\virtualenv_dir\Scripts>python
            Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)]
                    on win32
            Type "help", "copyright", "credits" or "license" for more information.
            >>> import django
            >>> django.get_version()
            '2.1.4'
            >>>
  

如果能够导入Django并能运行相关命令,说明安装成功。

2.2 Django基本知识

Django可自动实现Web应用的通用功能,减少程序员编码工作量,“不重复造轮子”是该框架的设计理念。

2.2.1 Django的开发优势

Django是一个非常优秀的Web开发框架,可以快速构建高性能、安全、可维护、界面优秀的网站,Django负责处理网站开发中麻烦的部分,使程序员可以专注于编写应用程序业务逻辑代码,而无须重新开发Web应用的通用功能,这就是所谓的“不重复造轮子”。

Django的开发优势是非常明显的,总结如下。

(1)功能完备:Django提供了“开箱即用”的功能,这些功能可以无缝结合在一起,并遵循一致性设计原则,对开发人员来说非常重要。Django有完善的ORM、强大的路由映射功能、完善的视图模板的实现、强大的缓存支持等。

(2)通用:Django可以构建多种类型的网站,可以与许多客户端框架一起工作,支持并且可以提供多种格式的内容,如HTML、RSS(Really Simple Syndication,简单信息整合)、JSON (Java Scripe Object Notation,Java Script对象简谱)、XML(Extensible Markup Language,可扩展标记语言)等格式的内容。

(3)安全:Django能够自动保护网站,避免许多常见的安全错误。例如要将session放在cookie中这种易受攻击的方式改变为一种安全的方式,就让cookies只包含一个密钥,实际数据存储在数据库中;并用hash()函数加密用户密码。默认情况下,Django可以防范许多漏洞,包括SQL(Structur Query Language,结构查询语言)注入、跨站脚本、CSRF(Cross-Site Request Forgery,跨站请求伪造)、单击劫持等。

(4)可移植:Django是用Python编写的,Python能在许多操作系统上运行,因此用Django开发的程序不受特定服务器操作系统的限制,可以在Linux、Windows、mac OS等操作系统上正常运行。

(5)自助管理后台:Django拥有一个强大的Django Admin管理后台,用户几乎不用写代码就拥有一个完整的后台管理页面。

2.2.2 Django的MTV设计模式简介

MVC(Model-View-Controller)设计模式的概念存在时间长,也比较流行,所谓的MVC就是把Web应用分为模型(Model)、视图(View)和控制器(Controller)3层,它们之间以松耦合的方式连接在一起。MVC的通用解释是采用透明的数据存取方式,然后单独划分一层来显示数据,并且加上一个控制它的层,如下。

(1)模型代表数据存取层,它提供数据获取的接口,使模型从数据库中获取数据时,无须了解不同数据库取得数据的方式。模型通常会为数据库提供一层抽象与封装,这样无须更改代码就能使用不同的数据库。

(2)视图代表界面,是模型的表现层,决定在应用中显示什么和怎么显示。

(3)控制器负责业务逻辑,通过程序逻辑判断模型决定从数据库中获取什么信息,以及把什么信息传给视图。

Django也称得上遵守MVC设计模式,但它还有自己的特点,它的设计模式常被称作MTV设计模型,M指的是数据模型(Model),T指的是模板文件(Template),V指的是视图函数(View)以及与它有密切关系的URL配置,现介绍如下。

(1)模型:用来定义数据结构的类,并提供数据库表管理机制,主要用来定义字段的名称、类型、字段最大值、默认值、约束条件等。

下面列举一段数据模型的代码,给大家一个初步印象。

            from django.db import models
            # 在此处编写数据模型代码
            # 员工数据模型(员工数据表)
            class employee(models.Model):
              # 员工姓名
              name=models.Char Field(max_length=32,verbose_name='姓名')
              # 员工邮箱
              email=models.Email Field(verbose_name='邮箱')
  

这段代码展示了一个非常简单的Django数据模型,从代码中可以看到,数据模型类必须继承于models.Model,它在类中定义了两个属性name和email,这两个属性相当于数据库表的字段,它们为字符类型,代码还设置了字段的一些约束,如最大长度、字段显示名称等。

(2)模板文件:一般是HTML格式,用于定义文件的结构或布局,并使用占位符表示相关内容,通过视图函数提取数据模型的数据填充HTML文件的占位符,可以创建动态页面。

下面列举一段模板文件的代码。

            <!DOCTYPE html>
            <html lang="en">
            <head>
              <meta charset="UTF-8">
              <title>Title</title>
            </head>
            <body>
            {{ hello }}
            </body>
            </html>
  

模板文件输出指定文档的结构,占位符用于表示在生成页面时填充的数据。在以上代码中,{{ hello }}称为模板变量,是一个占位符,视图函数可以用render()把变量hello传过来,在页面上显示时会用变量的实际值替换{{ hello }}。

(3)MTV的V包含视图函数以及与它有密切关系的URL配置。

视图函数:是一个处理Web请求的函数,它接收HTTP请求,经过一番处理,返回HTTP响应。也就是视图函数接收请求后,到数据模型里拿到客户端需要的数据,把数据以一定的格式传递给模板文件,然后Django把模板文件以HTTP 响应格式发送给浏览器。

下面列举一段视图函数的代码。

            # 导入HTTP相关模块
            from django.http import Http Response
            def hello(request):
              # 前面可以有向数据模型请求数据的代码
              # 返回响应
              return Http Response('Hello World!')
  

视图函数要求必须接收一个Http Request对象作为参数并返回Http Response对象,以上代码只是返回了一个字符串。

提示:在Django中模块指的是函数库,就是存放多个函数的一个文件。如果我们要在代码中使用某个函数,就导入这个模块。例如以上代码,通过from django.http import HttpResponse导入了HttpResponse,就可以在视图函数中使用HttpResponse()函数了。

URL配置:建立URL与视图函数对应关系,相当于URL映射器,主要作用是根据浏览器(客户端)的URL,将HTTP请求重定向到相应的视图函数进行处理。

下面列举一段URL配置的代码。

            from django.contrib import admin
            from django.urls import path
            from . import views
            urlpatterns = [
              path('admin/', admin.site.urls),
              path('hello/',views.hello),
              ]
  

URL 配置一般存储在名为urls.py的文件中。在以上代码示例中,urlpatterns定义了特定URL表达式和相应视图函数之间的映射列表,如果接收到具有与指定模式匹配的URL的HTTP请求,则将调用相关联的视图函数(例如views.hello)并传递请求。

2.2.3 Django的其他功能

2.2.1节介绍了Django的主要功能,除此之外,Django还提供了其他的功能或模块,列举如下。

●表单:Django通过表单进行数据验证和处理。

●用户身份验证和权限:Django有一个强大的、安全性很高的用户身份验证和权限系统。

●序列化数据:Django可以轻松地将数据序列化,并支持XML或JSON格式。

●管理后台:Django Admin管理后台使系统管理员能够轻松创建、编辑和查看网站中的任何数据模型,这个管理后台是Django默认包含的。

●缓存机制:Django提供灵活的缓存机制,可以存储部分页面,提高网页响应速度。

2.2.4 Django的主要文件

Django按照MTV设计模式以松耦合的方式把不同功能分配到各个文件,这些文件“各司其职”,通过代码或配置的方式完成独立功能,并与其他文件进行协作。

(1)urls.py是进行URL配置的文件,是网址入口,建立URL表达式与视图函数的对应关系,也就是建立“访问网址就是调用函数”的机制。

(2)views.py是视图函数存放模块,处理用户发出的请求。用户请求从urls.py中的配置项映射过来,逻辑代码分析用户请求后,从数据库中提取数据,向templates文件夹中的模板文件传递数据。

(3)models.py是数据模型,定义数据表结构,是数据库操作的基础。

(4)forms.py是Django表单定义文件,通过表单及字段属性设置,生成页面文本框,对用户提交的数据进行验证。

(5)templates文件夹中的文件是模板文件,这些文件是视图函数渲染改造的对象,一般是HTML文件,它与视图函数共同生成具有动态内容的网页。

(6)admin.py是管理后台配置文件,经过简单的配置代码,就能让后台对数据库数据进行管理。

(7)settings.py是Django配置文件,在文件中可设置应用程序模块、数据库类型、中间件等,可以让各应用程序共享配置内容。

(8)apps.py是应用程序本身的配置文件。

(9)tests.py是用来编写单元测试代码的文件。

2.3 Django基本开发流程

Django开发环境搭建好后,就可以进入开发流程了。开发的主要工作包括部署开发环境,创建项目和应用程序,编写业务逻辑代码,建立URL与视图函数的对应关系,根据项目实际情况在settings.py文件中进行设置,做好数据库连接与操作,根据需要启动Django后台管理等。

2.3.1 部署开发环境

由于Windows普及率高,图形界面较为友好,因此本节在Windows 7、Python 3.6.3环境中讲解Django开发环境部署,在命令行终端输入以下命令安装Django。

pip install django

安装完成后,找到 python 安装目录,如果在目录下的/Python36/Scripts 文件夹中有一个django-admin.exe文件,就说明Django已安装成功。把scripts文件夹的路径(形如×:/Python/Python36/ Scripts;)加入操作系统的环境变量Path中,这样就可以直接在命令行终端输入Django命令。

2.3.2 创建项目

选择一个目录放置我们的项目,这里假设放在test_django目录下。在命令行终端输入以下命令。

            cd test_django
            django-admin startproject myproject
  

第二句命令建立项目myproject,进入test_django目录就会发现新增了一个myproject目录,即项目myproject的根目录,这个目录的结构如下。

            manage.py     # 简单的命令文件封装文件,可以通过这个文件生成应用程序
            myproject/     # 一个目录,与项目名称一样,称为项目目录
              __init.py__  # 一个空文件,用来告诉Python这是myproject目录的一个模块
              settings.py  # 项目配置文件,包含一些初始化设置
              # 存放URL表达式的文件,这里定义的每一个URL都对应一个视图函数,这个文件称为路由文件
              urls.py
              # 服务器程序和应用程序的一个协议接口,规定了使用的接口和功能,这个文件不需修改, Django已为项目配置好
                      wsgi.py
  

2.3.3 创建应用程序

在一个项目下可以有多个应用程序并实现不同功能,Django可以根据需求建立多个应用程序模块,各个应用程序模块共享项目的配置环境,本节中建立的应用程序模块会共享/myproject/myproject目录中settings.py、url.py的配置。

生成应用程序非常简单,在命令行终端输入以下命令即可。

            cd myproject
            python manage.py startapp myapp
  

第二行命令生成应用程序模块,运行完成后在/myproject下会多一个目录myapp,该目录的结构如下。

            myapp/
              __init__.py
              admin.py  # 配置管理后台,写少量代码就可以启用Django Admin管理后台
              apps.py:  # 存放当前应用程序的配置
              models.py  # 存放数据库相关的内容
              tests.py  # 可在这个文件写测试代码以对当前应用程序进行测试
              views.py  # 存放业务请求功能的代码
              migrations/ # 这个文件夹中的文件保存该应用程序的数据库表与变化的相关内容
  

2.3.4 编写业务逻辑代码

业务逻辑代码按照Django的约定一般要写在views.py文件中,换句话说就是要在views.py文件中生成一个视图函数并在其中编写代码。打开/myproject/myapp/views.py,输入以下命令。

            from django.shortcuts import Http Response
            # 在此处编写视图函数代码
            def index(request):
              return Http Response('<h1>hello world</h1>')
  

第一行命令导入Http Response函数,这个函数把传入参数的内容显示在网页上。在views.py文件中可以通过函数编写代码实现业务逻辑,这些函数被称为视图函数。以上代码中的index()函数就是一个视图函数,它实现了在网页上显示hello world的功能。

2.3.5 建立URL与视图函数的对应关系

按照Django的约定,URL与视图函数的对应关系要放在urls.py文件中,对应关系以URL配置项形式放在文件中的一个列表变量中。打开路由文件urls.py,在urlpattens列表中增加“path('index/', views.index),”建立URL与视图函数的对应关系。path()的第一个参数是URL表达式,用来匹配网址;第二个参数views index指的是views.py文件中的函数。

提示:URL 表达式路径只匹配网址中域名后面的部分。如 index/可以匹配 http://127.0.0.1:8000/index/这个网址,其中“http://127.0.0.1:8000/”这部分自动被忽略。

urls.py文件代码如下。

            from django.contrib import admin
            from django.urls import path
            # 导入视图函数
            from myapp import views
            urlpatterns = [
              path('admin/', admin.site.urls),
              # 指定URL与视图函数的对应关系
              path('index/',views.index),
              path('test/', views.test),
            ]
  

以上代码要用到views.py中的index()函数和test()函数,因此要在代码头部引用包含这两个函数的文件,引用语句为from myapp import views。

到现在为止,我们实际上已经开发了一个简单的网页程序,可以通过命令启动程序,在命令行终端输入以下命令。

python manage.py runserver

等程序启动完成后,就可以进行测试了,Django 运行程序默认用到端口 8000,在浏览器上输入http://127.0.0.1:8000/index/进行测试,程序运行情况如图2.1所示。

图2.1 程序测试页面

2.3.6 动态加载HTML页面

前面几小节仅生成了一个简单页面,没有用HTML代码展现页面,仅是一个样例,本小节我们将介绍如何动态加载HTML页面。

在项目根目录/myproject/下新建文件夹,名称为 templates(这个名字约定不要修改)。然后在templates文件夹下新建一个HTML文件作为测试模板文件,名字为test.html,其代码如下。

            <!DOCTYPE html>
            <html lang="en">
            <head>
              <meta charset="UTF-8">
              <title>测试模板</title>
            </head>
            <body>
              <div align="center">
                <h1>{{ hi }}</h1>
                <hr>
                        <h2>{{ test }}</h2>
              </div>
            </body>
            </html>
  

这个HTML文件的代码非常简单,主要是用于测试,代码中双花括号包括一个变量,称为模板变量,形如{{ 变量名 }},注意变量名与双花括号之间前后都有空格。Django 模板引擎会用传入的值替换这些变量,传值的代码写在/myproject/myapp/views.py文件中,代码如下。

            from django.shortcuts import Http Response,render
            …
            def test(request):
              hi='你好,世界是美好的'
              test='这是一个测试页,动态页面正常显示,测试成功!'
              return render(request,'test.html',{'hi':hi,'test':test})
  

上述代码的相关说明如下。

(1)向HTML文件传递参数,一般用render()函数,代码首先要导入render。

(2)最后一行代码,通过render()函数向test.html传递模板变量(第3个参数),参数是字典类型,注意字典的key的名字一定与HTML文件中模板变量名一致,并用单引号括起来。

模板文件HTML文件写好后,要让Django知道文件位置,需要在setttings.py中设置一下。打开/myproject/myproject/setttings.py,找到TEMPLATES代码块,修改DIRS值,代码如下。

            # 在本项目中可推导出BASE_DIR值为/myproject/
            BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
            …
            TEMPLATES = [
                {
                        'BACKEND': 'django.template.backends.django.Django Templates',
                        # 添加路径到DIRS列表中
                         'DIRS': [os.path.join(BASE_DIR,'templates')],
                         'APP_DIRS': True,
                         'OPTIONS': {
                          'context_processors': [
                           'django.template.context_processors.debug',
                           'django.template.context_processors.request',
                           'django.contrib.auth.context_processors.auth',
                           'django.contrib.messages.context_processors.messages',
                          ],
                         },
                },
              ]
  

在settings.py中BASE_DIR值为/myproject/,因此DIRS的值为/myproject/templates/, test.html文件正是在这个目录下。

在命令行终端输入python manage.py runserver命令进行测试,运行情况如图2.2所示。

图2.2 HTML文件载入浏览器显示

2.3.7 配置静态文件存放位置

网页可以引用图像、音/视频、CSS、Java Script等形式的文件,使网页更生动,我们把这些文件存放在一个文件夹中,即静态文件夹。与2.3.6节同理,要让Django找到这些文件必须进行设置,首先在setttings.py文件的INSTALLED_APPS代码块中要有“'django.contrib.staticfiles',”这一行代码,如下所示。

            INSTALLED_APPS = [
            …
                'django.contrib.staticfiles',
            ]
  

然后在setttings.py文件中增加以下代码。

            STATIC_URL = '/static/'
            STATICFILES_DIRS=(
              os.path.join(BASE_DIR,'static'),
            )
  

STATIC_URL是静态文件夹前缀,STATICFILES_DIRS中的是静态文件目录列表。我们以下面的配置为例做出解释。

            STATIC_URL = '/static/'
            STATICFILES_DIRS=(
              'c:/test1/static1/',
              'c:/test2/static2/',
              'c:/test3/static3/',
            )
  

假如HTML文件中有<script src="/static/jquery-2.2.0.min.js"></script>这一句引用Java Script文件的语句,这个语句中src以/static/开头。Django在查找jquery-2.2.0.min.js这个文件时,会在c:/test1/static1/、c:/test2/static2/、c:/test3/static3/这3个文件夹中去查找。所以说STATIC_URL的值/static/是一个路径前缀,可以理解为一个别名,它代表着STATICFILES_DIRS中列出的文件夹。

我们设置静态文件夹为 os.path.join(BASE_DIR,'static'),它的真实值就是/myproject/ static/。因此需要在/myproject/下新建文件夹static,将网页要引用的静态文件或相关文件夹保存在这里,如与Bootstrap相关的CSS、Java Script文件等。

在/myproject/templates文件夹下新建login.html文件,主要代码如下。

            <!-- 导入静态文件相关模块以及相关设置 -- >
            {% load static %}
            <!-- 设置浏览器用的字符集是简体中文 -- >
            <html lang="zh-CN">
            <head>
              …
                <title>登录页面</title>
                <link href="{% static 'bootstrap/css/bootstrap.min.css' %}" rel="stylesheet">
                <link href="{% static 'sigin.css' %}" rel="stylesheet">
                <link rel="stylesheet" href="{% static 'fontawesome/css/font-awesome.min.css' %}">
                <script src="{% static 'jquery-3.3.1.js' %}"></script>
                <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
            </head>
            <body>
            <div class="container">
              <form class="form-signin" method="post" action="">
                {% csrf_token %}
                      <h2 class="form-signin-heading">请登录</h2>
                        <p></p> <p></p>
                         <label for="username" class="sr-only">用户名</label>
                         <input type="text" id="username" name="username" class="form-control"placeholder="用户" required autofocus>
                <p></p><p></p>
                         <label for="password" class="sr-only">密 码</label>
                        <input type="password" id=password" name="password" class="form-control" placeholder="密码" required>
                  <button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
                            </form>
            </div> <!-- /container -->
            </body>
            </html>
  

上述代码的相关说明如下。

(1){% name %}这种形式的标签称为模板标签,可以实现与函数、代码语句相似的功能,后续章节将详细介绍。

(2){% load static %}表示HTML文件要加载静态文件的相关设置。例如<link href="{% static 'bootstrap/css/bootstrap.min.css' %}" rel="stylesheet">这句代码会被Django渲染成<link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet">形式,这样就指向静态文件的位置,而渲染后路径中的/static/是个前缀,与settings.py中STATICFILES_DIRS变量结合起来形成要查找的路径。

(3){% csrf_token %}涉及防止跨站请求伪造以及中间件的相关内容,这些Django都为我们设计好了,可直接使用,后续章节将详细介绍。

(4)<form class="form-signin" method="post" action="">的重点在method属性,这涉及网页提交的方式,最常用的有get和post两种。简单地说,get一般用于请求数据,post一般用于表单提交数据。

接下来编写登录页面业务逻辑代码,打开/myproject/myapp/views.py,增加以下代码。

            from django.shortcuts import Http Response,render,redirect…
            def login(request):
              if request.method == "GET":
              # 打开login.html页面
                return render(request, "login.html")
              else:
                # 从表单提取用户名
                username = request.POST.get('username')
                # 从表单提取密码
                password = request.POST.get('password')
                if (username=='test' and password=='123'):
                # 用户名与密码都正确时,定向到test.html渲染的页面
                         return redirect('/test/')
                else:
                         return render(request, "login.html", {'error': '用户名或密码错误!'})
  

上述代码的相关说明如下。

(1)由于要对载入的HTML文件进行渲染并且要用到页面重定向功能,代码首先导入render和redirect模块。

(2)代码通过if request.method =="GET"判断提交方式。如果是GET,就显示登录页面;如果是POST,就接收提交数据并判断正误,如果正确就定向到测试页面。

(3)注意在HTML文件中method值(如post、get)可以是小写形式,在views.py的代码中method值必须大写形式。

(4)如果用户名与密码都正确,网页定向到测试页面,用return redirect('/test/')实现。

最后一步添加路由,加上URL与视图函数的对应关系,在/myproject/myproject/urls.py文件中编写如下代码。

            from myapp.views import index,test,login
            urlpatterns = [
            …
              path('login/',login),
            ]
  

由于用到views.py中的login()函数,第一行代码导入了login()函数。

最后测试成果,进入/myproject/目录,通过python manage.py runserver启动程序。在浏览器上输入地址进行测试,将得到一个较美观的登录页面,如图2.3所示。

图2.3 登录页面

正确输入用户名与密码,页面进入测试页面(如图2.2所示),就表明程序运行正常。

2.3.8 连接数据库

Django可以称作面向数据的开发框架,用命令生成项目与应用程序后,项目根目录下会生成一个默认的数据库db.sqlite3,在settings.py文件中有这个数据库的默认连接,代码如下。

            DATABASES = {
              'default': {
                # 数据库引擎,指明数据库类型
                'ENGINE': 'django.db.backends.sqlite3',
                # 指明数据库所在位置,本项目中数据库位置:/myproject/db.sqlites
                'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
              }
            }
  

提示:Django可以生成数据库表,不能生成数据库,生成数据库要用到数据库原生命令。

以MySQL为例讲解数据库连接,MySQL数据库安装本书不作介绍,请参考其他相关资料,我们假设MySQL数据库已安装完成。

第一步,安装Django的MySQL模块,在命令行终端上输入以下命令。

pip install pymysql

第二步,在MySQL中建立数据库,通过root用户登录,进入MySQL数据库管理界面,用create database mytest命令建立数据库mytest。

第三步,在settings.py中设置DATABASES代码块,代码如下。

            DATABASES = {
              # 'default': {
              #   'ENGINE': 'django.db.backends.sqlite3',
              #   'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
              # }
              'default': {
                'ENGINE': 'django.db.backends.mysql', # 数据库引擎,指明数据库类型
                'HOST': '127.0.0.1',  # 数据库存储在本机
                'PORT': '3306',    # 端口号
                'NAME': mytest',    # 数据库名称
                'USER': 'root',    # 数据库用户名
                'PASSWORD': 'root',  # 数据库密码
              }
            }
  

第四步,在/myproject/myapp/models.py中建立数据表,在models.py文件中每个类生成一个数据表,这里生成一个用户信息表User Info,代码如下。

            from django.db import models
            # 在此处编写数据模型代码
            class User Info(models.Model):
              user=models.Char Field(max_length=32,verbose_name='姓名')
              email=models.Email Field(verbose_name='邮箱')
              def __str__(self):
                return self.user
  

上述代码的相关说明如下。

(1)第一行代码导入models模块。

(2)通过建立User Info类建立User Info数据表。

(3)__str__返回模型对象的描述,可以理解为User Info类的实例对象的别名。

第五步,models.py中有了代码,它所属的应用程序必须在settings.py的INSTALLED_APPS代码块中注册,代码如下。

            INSTALLED_APPS = [
              …
                      # 注册应用程序myapp
                      'myapp',
            ]
  

第六步,在项目目录/myproject/myproject/__init__.py中编写以下代码,指明以pymysql模块代替MySQLdb模块,这里要十分注意字母的大小写。

            import pymysql
            pymysql.install_as_MySQLdb()
  

运行命令生成数据表,在命令行终端输入以下命令。

            python manage.py makemigrations
            python manage.py migrate
  

登录MySQL数据库管理界面,可以看到已经生成数据表,即图2.4所示的myaap_userinfo。

图2.4 在MySQL中生成的数据表

提示Django生成数据表时会把models.py中的类名转成小写,然后在前面加上应用程序的名字和下划线,如“myapp_userinfo”。

以auth_和django_开头的数据表是Django自动生成的系统表,后台管理系统会用到这些表。

2.3.9 Django后台管理

本小节内容比较重要,本小节展示了仅用少量代码迅速建立一个功能全面的后台管理系统。由此可认识Django强大的功能。

注册数据库表,在/myproject/myapp/admin.py中注册models.py生成的数据表,代码如下。

            from django.contrib import admin
            from .models import User Info
            # 注册数据库表
            # 自定义数据模型在管理后台的显示样式
            class User Info Admin(admin.Model Admin):
              # 指明在Django Admin管理后台列表模式下显示哪几个字段
              list_display=('user','email')
            admin.site.register(User Info,User Info Admin)
  

上述代码的相关说明如下。

(1)list_display表示数据列表展示时,显示哪些字段。

(2)admin.site.register()函数表示:如果只有一个参数,以默认方式在后台显示或管理数据表;如果有第二个参数,就按第二个参数传入的类定制的方式显示和管理数据表。

为了使后台管理系统用中文显示,需要在settings.py中修改LANGUAGE_CODE、TIME_ZONE两个变量,修改的值如下。

            LANGUAGE_CODE = 'zh-hans'  # 语言格式
            TIME_ZONE = 'Asia/Shanghai' # 设置时区
  

创建后台管理超级用户,需在命令行终端输入python manage.py createsuperuser命令,按提示输入用户名、电子邮箱地址、密码等相关信息,如图2.5所示。

图2.5 建立后台管理超级用户

最后就是验证成果了,在命令行终端输入python manage.py runserver,用新建的超级用户的用户名和密码登录,如图2.6所示,进入后台管理系统。

进入后台管理系统后,就可以对数据表进行各类操作与管理,如图2.7所示。

图2.6 登录后台管理系统

图2.7 后台管理系统

经过简单配置与少量的代码就建立了功能完善的后台管理系统。大家可以按照以上步骤建立一个系统,体验一下Django的强大功能。

2.4 小结

本章首先简要介绍了Django安装过程和Django的MTV设计模式。接着介绍了Django基本开发流程,让读者对Django开发有整体的、初步的认识。阅读本章后,读者可基本了解Django,并能够成功部署Django开发环境。