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模板都是一样会继续执行的,
转载于:https://www.cnblogs.com/2012-dream/p/8377501.html
day73 中间件 以及模板引擎相关推荐
- koa --- 监听路由,并使用模板引擎渲染显示
使用路由 /Koa实战/routes/index.js const Router = require('koa-router'); const router = new Router();router ...
- 前端笔记之NodeJS(三)Expressejs模板引擎请求识别
一.Express框架 1.1基本使用 创建http服务器特别麻烦,express框架解决了这个的问题. Express在node界的地位,就相当于jQuery在DOM界的地位.jQuery的核心就是 ...
- ORM MVC、模板引擎介绍(建议收藏)
ORM ORM 一.什么是ORM 二.认知 ORM 三.数据库和对象的映射关系 四.优缺点 五.常用的 ORM 库 MVC 什么是MVC 模板引擎 ORM 一.什么是ORM ORM是随着面向对象的软件 ...
- Koa中使用art-template模板引擎,以及如何接受post请求等
直接上代码,每个代码的作用都有注释: 实现了以下功能: 1.koa中如何使用路由 2.koa中如何使用art-template模板引擎 3.koa中如何使用koa-static解析静态文件 4.koa ...
- Node 简介、模块、模板引擎、NPM、文件操作、缓冲区、文件流、网络操作、Express框架
一.Node简介 1.1 客户端的JavaScript是怎样的 问题 答 什么是 JavaScript 脚本语言 运行在浏览器中 一般用来做客户端页面的交互(Interactive) JavaScri ...
- Node.js开发入门—使用jade模板引擎
在"Node.js开发入门--Express安装与使用"里,我们曾经使用express generator创建了一个HelloExpress网站,express工具为我们生成了基本 ...
- pug模板引擎基本用法
一.pug模板引擎基本用法 Pug是jade的新版,jade由于商标已被注册,所以更名为pug. 缩进标注:Pug模板和大多数模板不同,它有自己的语法特点,采用缩进的方式进行标注,使用这种方式,使得代 ...
- SpringBoot (三) :SpringBoot使用Freemarker模板引擎渲染web视图
什么是Freemarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而 ...
- SpringBoot-web开发(三): 模板引擎Thymeleaf
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) 目录 1. 引入 ...
- php codeigniter 语言,php – codeigniter模板引擎,包括语言解析器
不幸的是,CI内置的模板解析器类没有此功能.你可以在 sparks directory中环顾四周,有多个火花集成了许多模板引擎,如smarty或twig,可以通过调整来创建这样的东西. 此外,您可以尝 ...
最新文章
- Banknote Dataset(钞票数据集)介绍
- 阿里老P8,被大学天天打游戏的室友吊打了!
- 985学校计算机专业毕业月薪过万,这八个985和211大学分数低,容易考,毕业后月薪过万...
- 探索 .NET团队对API的设计流程
- linux自动点击软件上的按钮有什么用,教会你Linux Shell自动交互的三种方法
- 深度学习笔记其一:基础知识和PYTORCH
- 【python】nonebot--QQ接口库
- IP 点分十进制表示法
- 架构设计 例子和实践 系统设计说明书
- vs 2010旗舰版问题
- ES6 filter 过滤数组 | 图片onload同步等待获取图片宽高
- error:Fatal error: Uncaught -- Smarty Compiler: Syntax error in template D:\sms\xampp\htdocs\lanyu
- APOLLO基本介绍
- 学会3招缓解家务病 身体才能更健康
- 2020年11月4日
- C# 微信证书签名,WECHATPAY2-SHA256-RSA2048 签名方式
- 如何购买SAP软件?
- MTCNN配置及训练详细步骤
- matlab 群延迟,实现最小相位群延迟的音节切分算法的一些问题
- 设置计算机关机时间快捷键,怎么让电脑定时关机设置大全