flask学习心得
-1 Jinja2模板的具体知识
1 视图函数主要有两个功能 处理业务逻辑返回响应内容。在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本,而模板的作用就是承担视图函数的另一个功能返回响应内容
模板是一个包含响应文本的文件,用占位符表示动态部分,告诉模板引擎其具体的值需要从使用的数据中获取。 使用真实值替换变量 在返回最终得到的字符串 这个过程称为渲染
这样视图函数只需要负责业务逻辑和数据处理 而模板则取到视图函数的数据结果进行展示 这些耦合度低 结构清晰
Flask提供的render_template函数封装了模块引擎也就是具体替换的功能 其核心还是运用了正则的替换
render_template函数的第一个参数是模板的文件名,后面的参数都是健值对,表示模板中变量对应的真实值
1变量代码块
1.{{}}来表示变量名 这种语法叫做变量代码块
2.jinjia2模板中的变量代码块可以是任意python类型或者对象,只要它能够被python的str方法转换为一个字符串就可以,
3.用{%%}定义来控制代码块 可以实现一些语言层次的功能,比如循环或者if语句
4 . 使用{##}进行注释,注释的内容不会在html中被渲染出来
模板变量的基本使用
1过滤器
过滤器的本质就是函数。不仅仅只需要输出变量的值,还需要修改变量的显示,甚至格式化 运算 但在模板中是不能直接调用Python中的某些方法,所以用过滤器
使用方法 变量名 | 过滤器
{{variable | filter_name(*args)}}
如果没有任何参数传给过滤器 ,则可以把括号省略掉
{{variable | filter_name}}
在jinja2中,过滤器是可以支持链式调用的
{{‘变量’ | reverse | upper} }
常见内置的过滤器
1 safe 禁止转义 因为jinja2默认是会对html字符进行自动转义 的 所以可以使用safe过滤器取消自动转义
2 . capitalize 把变量值的首字母转成大写其余字母转小写
3 . lower 把值转成小写
4 . upper 把值转成大写
5 . title 把值中的每个单词的首字母都转成大写
6 . reverse 字符串反转
7 . format 格式化输出
8 . striptags 渲染之前把值中所有的html标签都删掉
9 . truncate 字符串截断
2列表操作
1 first 取第一个元素
2 last 取最后一个元素
3 length 获取列表长度
4 sun 列表求和
5 sort 列表排序
3过滤代码块是怎么用的?
4自定义过滤器
因为过滤器的本质是函数所以可以自定义
有两种实现方式
1 通过Flask应用对象的add_template_filter方法这个方法的第一个参数是函数名 第二个参数是自定义的过滤器名称
注意必须设置形参来接收模板变量的值
需要将转换后的内容返回
2 通过装饰器来实现自定义过滤器
(通过装饰器怎么实现过滤器)??
注意:自定义的过滤器名称如果和内置的过滤器重名 会覆盖内置的过滤器
比如说 自定义一个列表反转的过滤器
5控制代码块 重点
多敲几遍代码
if语句 在jinja2语法中的If语句跟python中if相似。返回布尔值的表达式决定代码中的哪个流程先执行
同时过滤器也可以被用在if语句中
for循环 在jinja2中 使用循环来迭代任何列表或者生成器函数
循环和If语句可以组合使用 以模拟python循环中的continue功能
1 loop.index 当前循环的次数 从1开始
2 loop.index() 当前循环的次数 从0开始
3 loop.revindex 当前循环倒数的次数 从1 开始
4 loop.revindex() 当前循环倒数的次数从0开始
5 loop.first 如果是第一次迭代 为True
6 loop.last 如果是最后一次迭代 为True
7 loop.length 循环的总次数
8 在一串序列期间取值的辅助函数,
cycle函数会在每次循环的时候,返回其参数中的下一个元素
6模板继承
1 模板继承是为了重用模板中的公共内容 一般web开发 继承主要使用在网站的顶部菜单,底部 这些内容可以定义在父模板中 子模版直接继承 不需要重复书写
就好比在父模板中挖个坑,当子模版继承父模板时 可以进行填充
子模版使用extends指令声明 这个模板继承自哪个模板
父模板中定义的块在子模版中被重新定义 在子模版中调用父模板的内容可以使用super()
模板继承时需要注意
1 不支持多继承
2 为了便于阅读 在子模板中是由extends时 尽量写在模板的第一行
3 不能在一个模板文件中定义多个相同名字的block标签
4 当在页面中使用多个block 标签时 建议给结束标签起个名字 当多个block嵌套时 阅读性更好
7模板中特有的变量和函数
可以在自己定义的模板中访问一些Flask默认内置的函数和对象
config 从模板中直接访问Flask当前的config对象
request 代表当前请求的request对象
session 为Flask的session对象
g 变量
在视图函数中设置g变量的name 属性的值 然后在模板中直接可以取出
url_for 它会根据传入的路由器函数名 返回该路由对应的url 在模板中始终使用url_for()就可以安全的修改路由绑定的url 则不必担心模板中渲染出错的链接
如果定义的Url 是带有参数的 则可以把它们作为关键字参数传入url_for() Flask 会把他们填充进最终生成的url中
get_flashed_messages()
这个函数会返回之前flask中通过flask()传入的消息的列表 或者说它可以取出通过flask()函数加入的数据
flask() 函数的功能是什么?
我的理解是把python的字符串 通过flask()加入到一个消息队列中
8前端渲染和后端渲染的区别
后端渲染 : 使用正则表达式在服务器端直接对Html进行替换
优点:有利于SEO(搜索引擎优化)
缺点:前后端不分离,开发效率低
前端渲染 前端使用Js对html内容进行更改
常用处理是发起ajax异步请求,后端以json形式返回数据 Js在根据返回的数据拼接html
优点 前后端分离,开发效率高 实现了局部动态刷新的效果