- Django实战:Python Web典型模块与项目开发
- 张晓
- 8763字
- 2021-03-10 10:40:48
第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开发环境。