整体文章目录
一、 当前章节目录
二、常见的Web开发框架
- Django:一种快速的网络框架。
(1)组件的合理集成。
(2)对象关系映射和多数据库支持。
(3)简洁的URL设计。
(4)自动化的管理界面。
(5)强大的开发环境 - Flask:一个轻量级的Web应用框架。
- Tornado:一个基于异步网络功能库的Web开发框架,与现在的主流Web服务器框架(包括大多数Python的框架)相比,最明显的区别是非阻塞式服务器,而且速度相当快。
- Web2py:一个为Python语音提供的全功能免费开源Web应用框架。
- 其他Web开发框架:
(1)Zope
(2)TurboGears
(3)CherryPy
(4)Pylons
三、MVC模式
3.1 MVC模式介绍
MVC是一种在软件工程中广泛使用的设计模式。特别适合于GUI设计和Web应用设计,可以方便地修改应用的表示层而不影响业务逻辑,或者修改底层业务逻辑而不影响其他部分。
(1)模型层次:包含了业务逻辑流程和状态,这些模型包含应用处理数据的方法。
(2)视图层次:包含最终用户的操作界面,包括输入数据和输出显示等。
(3)控制层次:可以实现对应用的具体控制。
3.2 MVC模式的优缺点
优点:
- 可以将业务逻辑和视图显示分开,从而实现简化处理、加速开发的目的,迅速实现用户需求。
- 有利于代码的管理,应用结构清晰,扩展性强。可以将代码分成多个部分来单独完成,只需要在各自的模块中定义好接口就可以了。
缺点:
- 需要进行比较详细的设计,严格分离会使得应用的调试比较困难。
- 在实际设计的时候,考虑到模块组合的复杂性,可以使得应用更加具有扩展性。
3.3 Django框架中的MVT
- M代表模型:负责业务对象和数据库的关系映射。与MVC中的M功能相同。
- V代表视图:负责业务逻辑,并在适当的时候调用Model和Template。与MVC中的C功能相同。
- T代表模板:负责如何把页面展示给用户。与MVC中的V功能相同。
四、Django开发环境的搭建
4.1 Django框架的安装
- Windows平台下安装Django框架
- Linux平台下安装Django框架
# 验证是否安装成功
In [1]: import django
In [2]: print(django.VERSION)
(3, 2, 3, 'final', 0)
4.2 数据库的配置
在setting.py文件中,可以通过设置下面的属性值来设置Django对数据库的访问。
- ENGINE:此值用来设置数据库引擎的类型。其中可以设置的类型包括其SQLite3、MySQL、PostgreSQL和Ado_msSQL等。
- NAME:此值用来设置数据库的名字。如果数据库引擎使用的是SQLite,需要指定全路径。
- USER:此值用来指定连接数据库时候的用户名。
- PASSWORD:此值用来指定使用用户DATABASE_USER的密码。当数据库引擎使用SQLite的时候,不需要设置此值。
- HOST:此值用来指定数据库所在的主机。当此值为空的时候表示数据将保存在本机中。当数据库引擎使用SQLite的时候,不需要设置此值。
- PORT:此值用来设置连接数据库时使用的端口号。当为空的时候将使用默认端口。同样的,此值不需要在SQLite数据库引擎中设置。
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysql', # 数据库库名(需提前创建好数据库)
'USER': 'root', # 用户名
'PASSWORD': 'a', # 连接密码
'HOST': '127.0.0.1', # 主机
'PORT': '3306', # mysql端口
}
}
五、Django框架的基本应用
5.1 Web应用的创建
# 查看django-admin中支持的命令选项
D:\python例题源代码\ch15code\blog>django-admin help
# 查看特定命令选项的帮助
D:\python例题源代码\ch15code\blog>django-admin help startproject
# 迅速创建项目
D:\python例题源代码\ch15code>django-admin startproject blog
1)__ init __.py:这是一个空文件,其用途主要来指示Python语言将此网站目录当作是Python的包
2)manage.py:此文件中主要是使得网站管理员来管理Django项目
3)settings.py:这是此Django项目的配置文件
4)urls.py:此文件中包含URL的配置文件,这也是用户访问Django应用的方式
5)wsgi.py:此文件是Python> Web服务器网关接口,用来描述Web Server如何与Web应用通信的规范
5.2 Django中的开发服务器
# 启动内置服务器
D:\python例题源代码\ch15code\blog>python manage.py runserver
D:\python例题源代码\ch15code\blog>python manage.py runserver 8001
D:\python例题源代码\ch15code\blog>python manage.py runserver 0.0.0.0:8000
5.3 创建数据库
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# 将生成的py文件应用到数据库
D:\python例题源代码\ch15code\blog>python manage.py migrate
5.4 生成Django应用
# 将生成的py文件应用到数据库
D:\python例题源代码\ch15code\blog>python manage.py startapp Account
1)_ pycache __:存储与cpython相关的文件,用于增强性能
2)migrations:用于在之后定义引用迁移功能
3) __ init __.py:这是一个空文件,在这里是必需的。用来将整个应用作为一个Python模块加载。
4)models.py:定义了数据模型相关的信息
5)views.py:包含此模型的相关视图操作
6)admin.py:用于编写Django自带的后台相关操作
7)tests.py:用于编写测试代码
8)apps.py:用于定义信息文件
5.5 创建数据模型
# models.py
from django.db import models
# Create your models here.
class Account(models.Model):
"""生成一个Account类"""
username = models.CharField('用户名', max_length=30)
password = models.CharField('密码', max_length=30)
email = models.CharField('电子邮箱', max_length=100, blank=True)
desc = models.TextField('描述', max_length=500, blank=True)
def __unicode__(self):
return self.username
# 在setting.py中加入
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'Account',
]
# 创建更改的文件
D:\python例题源代码\ch15code\blog>python manage.py makemigrations
5.6 URL设计
请求的URL地址为“url/sub-url/”,Django在URL的配置文件中匹配此请求URL,并调用相应的方法。
[19/Jun/2021 10:57:50] “GET /url/sub-url/ HTTP/1.1” 404 2552
ROOT_URLCONF属性值中可以设置此URL的信息。在setting.py里的值是blog.urls,也就是说URL的信息定义在根目录下的urls.py文件中。
# urls.py
from django.contrib import admin
from django.urls import path, re_path
from Account.views import random_number
from Account.views import index
urlpatterns = [
path('admin/', admin.site.urls), # 管理界面
path('index/', index),
path('Account/random_number/', random_number),
]
# Account目录下的urls.py
from django.urls import path
from .import views
urlpatterns = [
path('index/', views.index),
path('random_number/', views.random_number)
]
5.7 创建视图
# 根目录下的urlsviews.py
from django.http import HttpResponse
def index(request):
html = """<html>
<title>Main</title>
<body>
<h1>Main Page</h1><hr>
</body>
</html>"""
return HttpResponse(html)
# Account目录下的views.py
import random
def random_number(request):
body1 = "Random: %f <br />" % random.random()
body2 = "Random: %f <br />" % random.random()
body3 = "Random: %f <br />" % random.random()
html = "<html><body>" + body1 + body2 + body3 + "</body></html>"
return HttpResponse(html)
5.8 模板系统
<!--blog目录下新建一个templates文件夹,新建一个index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Main</title>
</head>
<body>
<h1>Main Page</h1>
<h2 style="color:red">Hello World!</h2>
</body>
</html>
# 需要修改Account目录下的views.py文件
def index(request):
return render(request, 'index.html')
# blog目录下的setting.py
TEMPLATES = [
{
# 部分省略
'DIRS': [os.path.join(BASE_DIR, 'templates')],
# 部分省略
}
]
六、Django框架的高级应用
6.1 管理界面
- 确认在项目的配置文件INSTALLED_APPS属性中已经加入django.contrib.admin。
# setting.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'Account',
]
-
确认是否生成了管理界面所需的表。如果没有则调用mannage.py的子命令makemigrations和migrate生成即可。(详细见5.3 创建数据库)
-
确认在项目根目录下的urls.py文件中已经有对管理界面的支持。打开urls.py文件,如下所示。
from django.contrib import admin
from django.urls import path, re_path
from Account.views import random_number
from Account.views import logout
urlpatterns = [
path('admin/', admin.site.urls), # 管理界面
path('index/', index),
path('Account/random_number/', random_number),
]
-
在浏览器中输入“http://127.0.0.1:8000/admin/”,将会出现如图所示的信息。
-
创建超级用户名和密码。在命令行中使用createsuperuser命令创建用户相关信息。
D:\python例题源代码\ch15code\blog>python manage.py createsuperuser
Username(leave blank to use 'hchlcomputer'):admin
Email address:
Password:
Password (again):
Superuser created successfully.
- 向管理网站注册模型。
- 现在,使用超级用户账户访问管理网站:http://localhost:8000/admin/,并输入你刚创建的超级用户的用户名和密码,弹出如下图所示,从中可以看出,这里还包含有Django框架内置的几个数据模型。Django框架中的管理员用户和密码就是保存在Users表中的。
6.2 生成数据库数据
D:\python例题源代码\ch15code\blog>python manage.py shell
In [1]: from Account.models import Account
In [2]: ac = Account(username="user2",password="user2123456")
In [3]: ac.save()
In [4]: ac_list = Account.object.all()
In [5]: print(ac_list)
<QuerySet[<Account:Account object (1)>]>
6.3 Session功能
因为HTTP是无状态的协议,所以当需要在多个连接之间保持状态,可以使用Session。
# setting.py
INSTALLED_APPS = [
# 部分代码省略
'django.contrib.sessions'
]
MIDDLEWARE = [
# 部分代码省略
'django.contrib.sessions.middleware.SessionMiddleware',
]
<!--在templates文件夹下的login.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
{% if not username %}
<form method="post" action="/login/">
{%csrf_token%}
Username:<input type="text" name="username" value=""><br/>
Password:<input type="password" name="password" value="">
<input type="submit" value="Login">
</form>
{% else %}
{{ username }} is log out!<br/>
<form method="post" action="/logout/">
{%csrf_token%}
<input type="submit" value="Logout">
</form>
{% endif %}
</body>
</html>
# 在Account文件夹下的views.py
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from Account.models import Account
@csrf_exempt
def login(request): # 登陆操作
username = request.POST.get('username', None)
password = request.POST.get('password', None)
if username:
ac_list = Account.objects.all() # 获取数据库中的数据
for ac in ac_list:
if ac.username == username and ac.password == password:
request.session['username'] = username
return render(request, 'login.html', {'username': username})
return render(request, 'login.html')
def logout(request): # 登出操作
try:
del request.session['username']
except KeyError:
pass
return HttpResponseRedirect("/login/")
# 在Account文件下的urls.py
from django.urls import path
from .import views
urlpatterns = [
path('index/', views.index),
path('random_number/', views.random_number),
path('login/', views.login),
path('logout/', views.logout)
]
# 在blog文件下的urls.py
from django.contrib import admin
from django.urls import path, re_path
from Account.views import random_number
from Account.views import index
from Account.views import login
from Account.views import logout
urlpatterns = [
path('admin/', admin.site.urls), # 管理界面
path('index/', index),
path('Account/random_number/', random_number),
path('login/', login),
path('logout/', logout)
]
七、习题
习题:
- 怎么理解MVC?怎么理解Django的MVT?
- 分别描述Django中的模型、视图和模板的作用以及相互之间的关系。
- 访问http://docs.jinkan.org/docs/flask/,根据相关文档完成Flask应用。
答案:
- MVC是一种在软件工程中广泛使用的设计模式。MVC模式将一个应用分为3个层次:模型层次、视图层次和控制层次。通过这种分层的方式,设计模式可以将应用的输入处理、界面显示以及控制流程分开。
Django的MVT模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同- Django的MTV模式按照下面这样分层。
- M代表模型:负责业务对象和数据库的关系映射。与MVC中的M功能相同。
- V代表视图:负责业务逻辑,并在适当的时候调用Model和Template。与MVC中的功能相同。
- T代表模板:负责如何把页面展示给用户。与MVC中的V功能相同。
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template。
MVT模式的一般流程是:用户通过浏览器向服务器发起一个请求,这个请求回去访问视图函数,如果不涉及数据调用,那么这时视图函数返回一个模板也就是一个页面给用户,视图函数调用模型,模型去数据库里查找数据,然后逐级返回,视图函数把返回的数据填充到模板中,最后把页面展示给用户。