MVC模式和MTV模式
Django的MTV模式本质是各组件之间为了保持松耦合关系,Django的MTV分别代表:
- Model(模型):负责业务对象与数据库的对象(ORM)
ORM提供了sql的api,使用这个api就可以对数据库进行增删改查等操作。 - Template(模版):负责如何把页面展示给用户,通过渲染展示页面
- View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
上图就是django处理用户请求的流程
首先通过用户输入的url匹配,经过urls路由解析到views试图,这时会有两种情况:
- 用户请求的动态数据需要对数据库进行操作,通过models对数据库进行相应操作并返回结果,返回的单条数据格式为QuerySet,多条数据格式为QuerySetList,QuerySetList列表中的元素都是QuerySet。对应图中的1.1和1.2。然后又有两种情况,第一种直接把返回的数据不经过处理直接以json格式返回给用户,一般用于开发人员调试,对应图上步骤3;第二种数据经过template指定模板渲染后返回给用户html,对应图上步骤2.1和2.2。
- 如果用户请求的是静态页面,则不经过models,直接通过template渲染后返回用户htm页面,对应图上步骤2.1和2.2。
urls基础
在pycharm中创建一个django的项目,命名为test_django,application name命名为demo。
创建项目后会在test项目下生成demo、template、test_django三个目录和一个manage.py文件。其中demo和test_django目录下会生成一些py文件,manage.py为启动文件。
默认django收到请求后,首先要到test_django目录下的urls.py文件中去匹配请求的路径。
默认urls.py文件内容如下:
from django.conf.urls import url
from django.contrib import admin
from demo import views #导入demo包下的views模块,后来添加的
urlpatterns = [
url(r'^admin/', admin.site.urls), #其中括号内第一个参数为匹配的内容,第二个参数为匹配后执行的方法
url(r'^login/$', views.login), #login的请求转发给views模块内的login函数处理,后来添加的
]
demo包下的views.py文件内容
from django.shortcuts import render,HttpResponse,redirect
def login(request): #接收login页面的访问请求
return HttpResponse('Hello! This is a Demo.') #直接返回给用户
这时启动test_django项目,在浏览器中输入http://127.0.0.1:8000/login/ 回车,页面就会显示想要的内容。
修改下views.py文件
from django.shortcuts import render,HttpResponse,redirect
def login(request): #接收login页面的访问请求
if request.method == 'GET': #接收的请求是get方法时
data = 'Hello demo!'
msg = 'This is a Django project!'
return render(request, 'login.html', locals()) #locals方法是把data和msg传给template目录下的login.html文件,经过它的处理后返回给用户。locals必须要函数中的变量名和login.html中接收值的参数名相同,即login.html中接收data变量值的参数名也应该是data
#return render(request, 'login.html', {‘data’:data, 'msg':msg}) #另一种方法,其中字典中key的data对应login.html文件中的data,value的data对应函数中的变量data
template目录下的login.html文件内容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>{{ data }}</h3> #接收views.py中login方法下的data变量的值
<h3>{{ msg }}</h3> #接收views.py中login方法下的msg变量的值
</body>
</html>
启动test_django项目,访问http://127.0.0.1:8000/login/ 就会显示经过html渲染后的内容了。