day73 中间件 以及模板引擎
模板引擎:
基本实用{{k1}} if for
模板中自定义函数:操作步骤
1在已经注册的App中创建一个名字叫templates文件夹
2任意创建一个py文件,
3创建名字叫register 的Library类的对象
4定义函数 # 我们定义函数的时候函数的参数必须要自己写,指定的,不能是*args,**kwargs.否则会报错
from django.template import Library # 这一行是固定格式
register=Library() # 括号必须要加上 这一行是固定格式
在我们的模板里面填充数据,使用固定语法{{'字符串函数的第一个参数'|函数名:'函数的第二个参数'}}
参数最多是2个
支持使用if做判断
@register.filter # 我们的函数上面是必须要加上这个装饰器,内置的装饰器,否则会报错
def meikai(a1,a2): # 这里的a2可以是一个字符串里面有特殊符号连接,我们使用字符串里面的语法进行分割就得到了多个出来例如 {{'alex'|func'lily;jack'}}
def func(a1,a2):
n1,n2=a2.split(';') # 可以是任意符号去连接那么就使用该符号去分割
使用:
{% load xl %} # 在我们的模板也就是HTML文件里面引入我们自定义的那个函数所在的文件名,我们引入之后通过模板语言就可以使用这个函数传参然后拿到返回值把返回值渲染给页面提交浏览器
我们的xl文件这样写:
from django.template import Library
register=Library()
@register.filter
def func(a,b):
print(a,b)
data='%s name is %s' % (a,b) # 这里写成了动态的为了下面得到动态的返回值
return data # 这里的返回值就是动态的
在浏览器页面我们这样写:
<h2>{{'peter'|func'fred'}}<h2> #其他的是正常的HTML页面的标配,就是我们的body里面写一行这样的代码,可以用其他的标签包起来,这个看现实效果即可
中间件的内容是重点中的重点,必会
中间件就是一个类,
这个类需要继承MiddlewareMixin
类里面有两个方法,process_request(self,request) [可以没有返回值] process_response(self,request,response) ---[必须设置返回值]
1.我们要在django项目的App里面建立一个python pakage(这是一个模块包,是文件类型,文件名自定义,),然后建立一个py文件,
在文件里面就开始要写代码了,引入中间件模块和包,然后定义类,以及类里面的方法,
如下所示:
from django.middleware.common import CommonMiddleware
from django.utils.deprecation import MiddlewareMixin
# 这是第一个中间件
class M1(MiddlewareMixin):
def process_request(self,request):
print('m1.process_request')
def process_response(self,request,response):
print('m1.process_response')
return response
# 这是第二个中间件,中间件可以有多个,
class M2(MiddlewareMixin):
def process_request(self,request):
print('m2.process_request')
def process_response(self,request,response):
print('m2.process_response')
return response
我们需要对所有的请求做同一操作时,就使用中间件.
如果对少量的视图函数做操作就使用装饰器,
我们的django项目里面的setting里面有一个配置项
MIDDLEWARE就是中间件的意思,
MIDDLEWARE=[
'xxx.md.M1' # xxx是我们自定义的一个文件夹,md是我们在文件夹里面新建的一个py文件,M1是我们的py文件里面的定义的类名,这里是把我们的中间件的路径保存到我们的setting配置项里面了
]
这里就需要牵扯到我们的django请求生命周期了,这是核心的重点
我们的请求过来了,先是到达wsgi,然后到达中间件(可以有多个如果有多个的话,我们就按照程序从上到下加载的顺序一一去执行, 在返回的时候再从下到上一一按照顺序去执行,),再接着到路由系统,紧接着是到视图函数,再是到orm操作数据库,然后把数据取出来通过我们的模板进行渲染,(渲染后我们的结果就可以在前端页面显示出来了),我们需要把渲染后的数据结果拿到{process_request},然后原路返回,穿过orm,视图函数,路由系统,穿过中间件,以及wsgi,最后返回给用户{process_response 必须要有返回值,不可以为None,},这一套流程就是我们的django请求生命周期,
由上不难看出我们的所有请求都需要经过我们的中间件,所以我们对所有的请求做同一个操作的时候,只需要写好一个中间件即可,所有的请求都会经过它,这样效率是最高的.[如果我们写装饰器的话我们需要在使用到装饰器的函数上面一一加上我们的装饰器,如果函数有100个的话我们需要手写100个,单一重复的操作太多了,这里有可优化的空间,这个时候我们的中间件就刚好解决了这个问题,只要我们在setting里把我们的中间件配置好,我们的所有的函数都会走我们的中间件,那么我们只需要改动我们的中间件即可满足要求]所以我们需要理解这个原理,也就是我们的django请求生命周期,然后我们才明白每一步是干什么的,理解了原理之后我们可以随意改动每一步,以满足我们的需求.
总结,中间件的流程图,中间件类里面的方法,以及方法里面的参数,都是需要背下来的
=================================================================================================================================
整个请求周期如图所示
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
中间件的补充内容,process_view以及process_exception, process_template_response
如果响应的实例有render()方法,process_template_response()在视图刚好执行完毕之后被调用,这表明了它是一个TemplateResponse对象(或等价的对象)
我们的中间件总体流程,
客户端发送请求过来,先经过我们的wsgi,然后经过process_request方法,把所有的中间件里面的request方法走完之后,会走到我们的url.py的文件里面,把我们django里面所有的路由系统走一遍,然后再去从头走一遍我们的process_view方法,一个一个走下来,这里因为我们的request已经在前面走过了url路由系统,所以在这里我们的process_view可以提前预执行我们的views视图函数,在这里的时候,如果我们的views函数有异常的话,我们的中间件里面的process_exception它是专门捕获异常然后提前预处理异常的,把捕获到的结果经过它里面的逻辑代码处理后返回给用户一个更加便于理解的页面响应,这个时候肯定是有返回值的,一旦出现返回值那么就从当前节点开始返回从后往前的顺序一个一个走完process_exception,然后再走process_response方法,也是从后往前一个一个走一遍,把结果放回给wsgi,如果在process_views方法处没有出现异常,那就不会有process_exception出现,然后把函数的返回值响应给HTML模板,再返回给我们的process_response方法,把结果赋值给response,再从尾部一个一个返回给wsgi,
记住几个要点,process_response一定会执行,无论如何都必须会执行,一旦我们的process_request,process_views,process_exception,这三个步骤里面,有任何一个出现了return返回值,那么我们的中间件程序就在当前的节点终止了,招呼上该中间件所对应的process_response方法开始一同返程,沿原路返回,当然了仅仅是限于中间件的返程,中间件后面的url路由以及views视图函数还有HTML模板都是一样会继续执行的,