目录
Django的请求生命周期
所谓Django
的请求生命周期,直白的来说就是当请求来的时候和请求走的阶段中,Django的执行轨迹。
一个完整的Django
生命周期:用户从客户端发出一条请求以后,首先会基于http
协议去解析数据并封装,然后来到Nginx处理(nginx
监听公网ip
的某个端口,接到请求后,如果是静态资源,nginx
直接获取该资源并返回给用户,如果是动态资源,nginx
就将请求转发到uWSGI
,使用协议一般是uwsgi
),uWSGI
接收到请求以后,通过将http
协议转化为WSGI
协议,和Django
之间进行通信,此时,该条请求就真正的来到了后端之上,首先它会经过Django
的第一道工序:中间件,(而所谓中间件,简单来说就是请求来和请求走的时候Django
增加的一道工序,请求来和请求走的时候都要先经过中间件的处理,因此,也可以将中间件理解为Django
提供的额外功能组件),在经过中间件以后,来到Django
的第二道工序:路由层(urls.py)去筛选匹配符合符合请求命令后缀的地址,然后根据匹配到的地址去Django
的第三道工序:视图层(views.py)找到对应的视图函数/视图类里的属性,之后去到第四道工序:模型层(models.py)通过orm
操作去数据库中获取数据,拿到数据以后回到视图层(views.py)里对数据进行处理(序列化和反序列化),将处理后的数据返给Django的第五道工序:模板层(Templates),模板层接收到数据后,对数据进行渲染,之后再次经过视图层、路由层、中间件、uWSGI
服务器、Nginx
代理,最后将渲染的数据返还给客户端进行展示。
Django视图层
Django视图层即是Django的MTV设计模式中的Views,视图层主要接收来自客户端或者浏览器的请求,并最终返回响应,在Django中,主要的逻辑其实就是在视图层完成的。
而在Django中主要就是在通过在视图层编写视图函数来实现主要的业务逻辑,视图函数可以是python中的函数,也可以是类,视图函数接收到请求并最终返回响应,响应的类型可以是HTML文件,也可以是HTTP协议中的303重定向。
视图函数的编写
编写一个简单的视图函数:
from django.shortcuts import HttpResponse # shortcuts模块中导入了http
from django.http import HttpResponse # 两者是相同的效果
def test(request):
return HttpResponse("测试Django")
- HttpResponse:视图函数的响应类型
- request:在Django中,规定了,视图函数至少拥有一个参数,第一个参数必须是request,request是HttpRequest请求类型的对象,由 request对象携带浏览器发送的请求信息,所以视图函数的第一个参数必须是request。
- return视图响应:视图函数要返回响应内容,可以直接将返回的内容当做HttpResponse的对象返回给浏览器
视图函数执行过程
视图函数的执行过程:Django收到请求后,首先创建一个带有请求信息的HttpRequest对象
,将HttpRquest的对象request
作为第一个参数传递给视图函数
,视图函数在接收到request对象以后,可以根据request获取到用户的请求方式
,请求信息中的信息等,随后视图函数将继续向下执行,然后选择加载对应的视图,最后返还给HttpResponse对象
给浏览器/客户端
Django模板层
Django的模板层,简单来说,就是展示给用户的前端界面,在Django的生命周期中提到了,请求是经过视图层,然后通过模型层去数据库取数据,最后将拿到的数据交给模板层进行渲染并展示给用户。
可以说模板层主要的任务就是接收来自视图层处理后的数据,并对数据进行渲染,随后返还给用户。
模板层与视图层交互
在视图层新建一个视图函数
from django.shortcuts import render
def index(request):
content = {"value":"hello django"}
return render(request,"hello.html",content)
- render:render是视图层加载模板的一种方式,封装在django.shortcuts,使用render会将数据传递给html文件,随后在html文件里对数据进行渲染,返还给前段页面进行展示
- content:模板层可以接受来自视图层传递的数据,数据必须组成字段的形式才能传递给模板层,这就是“模板传参”。
在Django中模板层,一般命名为templates,也即是Django的MTV设计模式中的T,当请求访问到视图函数时,就会去templates(只能叫这个名字)目录下找到对应的html文件,然后返还给前端页面进行展示,这是Django底层封装好的。
所以在将视图函数写好后,我们去templates目录下新建一个hello.html文件,并写入如下内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ value }} # 使用变量替换user的值
</body>
</html>
模板语法
在Django中,存在一种DTL模板文件,所谓的DTL模板文件区别于一般的HTML文件,在Django中,HTML文件可以被Django编译,可以传递参数进去,实现数据的动态化,在编译完成后,生成一个普通的HTML文件,并返还给前段进行渲染展示。
而在模板文件中,提供了一种模板语法,可以让我们更快捷的拿到从视图层传递过来的数据,模板语法支持的数据类型包括(字符串、列表、字典等等),但是传递过来的数据只能是字典形式的。
变量
- 字符串:直接进行展示,可以进行索引取值,即点索引的方式,eg:
{{value.0}}
(取字符串索引为0的字符) - 列表:列表同时也支持索引取值的方式,eg:
{{list.0}}
(取列表的第一个值) - 字典:字典取值也是通过点的方式,即点key值的方式,eg:
{{dick.key}}
(取指定key的values值),同时也支持字典的其他内置方法
过滤器
此外,在模板语法中,还有一种用的比较多的filter过滤器,eg:{{list|first}}
(取列表的第一个值)
- 设置默认值:
{{dict.name|default=“json”}}
,取字典的name值,若没有则为json
- 大小写转换:
{{dict.name|upper}}
,取字典的name值,并全部转化为大写 - 将内容转化为列表:
{{dict.name|make_list}}
,取字典的name值,并转化为列表 - 把文件的大小的数值转换为单位表示:
{{dict.file_size|filesizeformat}}
,转化为文件格式大小 - 随机抽取某个成员:
{{dict.name_list|random}}
,随机从列表里选择一个
标签
标签在渲染的过程中提供了任意逻辑标签被{%
和%}
包围,如下显示
{% csrf_token %} # 免除csrf_token认证,浏览器自带的一种认证方式
{% for n in item %} # for循环,必须和endfor是成对出现
<li>{{ item.name }}</li>
{% endfor %}
{% if shop.state == 1 %} # if流程控制,必须和endif同时出现
{% else %}
{% endif %}
模板继承
在Django中,提供了另外一种好用的方法-->模板继承,对于页面修改不大的界面来说,完全可以使用模板继承的方式,然后再各自对数据进行不同的渲染就能达成页面的不一样,可以很好的降低前端人员的开发成本
{% include "模板文件名"%} # 模板嵌入
{% extends "base.html" %} # 模板继承,继承base.html父模板中的公共内容
父模板base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title> ###根据不同子界面的类型来添加
</head>
<body>
<h1>{% block head %}{% endblock %}</h1>
</body>
</html>
子模板
{% extends "base.html" %}
{% block title %}子模板的title{% endblock %}
{% block head %}子模板的head{% endblock %}
标签:生命周期,请求,request,视图,Django,模板,函数
From: https://www.cnblogs.com/PyLy/p/17110023.html