第一节:MVC与MTV模型
1.1MVC
Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M)-Model、控制器(C)-Controller和视图(V)-View三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器负责接收用户的输入调用模型和视图完成用户的请求,其示意图如下所示:
MVC的优缺点
优点:
把业务逻辑全部分离到Controller中,模块化程度高。当业务逻辑变更的时候,不需要变更View和Model,只需要Controller换成另外一个Controller就行了 。
观察者模式可以做到多视图同时更新。
缺点:
Controller测试困难。因为视图同步操作是由View自己执行,而View只能在有UI的环境下运行。在没有UI环境下对Controller进行单元测试的时候,Controller业务逻辑的正确性是无法验证的:Controller更新Model的时候,无法对View的更新操作进行断言。
View无法组件化。View是强依赖特定的Model的,如果需要把这个View抽出来作为一个另外一个应用程序可复用的组件就困难了。因为不同程序的的Domain Model是不一样的。
1.2 MTV
Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是指:
- M代表模型(Model):负责业务对象和数据库的关系映射(ORM)。
- T代表模板(Template):负责如何把页面展示给用户(html)。
- V代表视图(View):负责业务逻辑,并在适当时候调用Model和Template。
Django 通过URL控制器(urls.py)完成路由分发,针对不同的访问路径指派不同的函数;这些不同函数保存在view视图(views.py)中,完成import调用,views.py使用来存放视图 (逻辑)函数,视图(views.py)去Models.py取数据,Models.py到数据库中查找数据,将数据返回给视图(views.py)函数,views.py在Template模板(template文件夹)中找到相对应的模板拿过来,将数据嵌套在template模板中的模板中,最终提交给浏览器。
Django安装
Django 下载
pip3 install django==版本号
下载最新版
pip3 install django
pip是python 的一个下载工具
Django 命令:
创建一个Django项目:
django-admin.py startproject 项目名称
django-admin.py startproject myproject
创建一个应用(app01...app09):(进入项目)
python manage.py startapp 应用名称
python manage.py startapp app01
启动django项目
python manage.py runserver IP PORT (默认端口是8000)
一个简单Django项目的流程
URL路由(urls.py)
访问者 ----> URL控制器 ----> views.py(视图) ----> templates(构建模板)
如下图
创建好django项目以后,在项目目录下会存在一个和项目名称一样的目录,这个目录主要是存放一些全局性的配置文件;
Django项目 目录及文件说明:
mysite # 项目名称
mysite # 全局配置文件
-- urls.py # 路由控制层
-- settings.py # 全局配置文件
-- wsgi.py
-- asgi.py
app01 # 应用名称
-- views.py # 存放视图函数
-- models.py # 数据库交互模块
templates # 存放模板文件
URL控制器 重定向
Django 路由配置文件中加载re_path模块
通过re_path(‘正则表达式’,视图函数),举个栗子:
from django.contrib import admin
from django.urls import path,re_path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'^login/$', include('views.login')),
]
视图函数
向服务器发送请求形式:
1 浏览器地址栏:GET
2 超链接标签:GET
3 form表单(输入用户名密码):GET、POST
4 Ajax:可以发所有请求
--views.py--
def index(request):
# request:请求对象
# 得到请求方式
print(request.method)
# 得到请求数据
print("GET", request.GET)
print("POST",request.POST)
name = request.POST.get("name") # 请求字典的值(一个值)
print("name", name)
# name = request.POST.getlist("name") # 请求字典的多个值
# print("name", name)
# 请求路径
print(request.path) # 路径部分
print(request.get_full_path()) # 路径+参数部分
# 请求主机
print(request.get_host()) # 请求主机,例子:127.0.0.1:18088
print(request.get_port()) # 请求端口,例子:18088
return HttpResponse('index....')
浏览器 发送GET 请求带数据
http://127.0.0.1:18088/index/?User=alvin&pwd=123
例子:http://127.0.0.1:18088/index/?User=xiaowu&pwd=sports
<QueryDict: {'User': ['xiaowu'], 'pwd': ['sports']}>