在flask中 用户访问一个url 根据map_url映射 找到正确的视图函数 视图函数根据请求 处理返回正确的数据 返回字符串 html json数据 如果在每个视图函数中都写入html 那么工作量会很大 于是flask 就使用模板 渲染html
模板文件
模板文件一般约定放在APP下的template文件中 flask通过render_template( ) 函数 渲染函数 name=name传入变量 前面的name为模板中的变量名 后面name为在函数中的变量 在html模板中
用{{ name }}使用变量
模板语法
if 判断语句 jinjia2 使用{% %}标识在语句结束的时候要使用结束标签
例
{% if user.name %}
hello {{ user.name }}
{% else %}
hello boy
(% endif %)
for 循环语句 必须在结尾使用endfor标签声明for语句的结束
例
{% for i in number %}
this number is i
{%endfor%}
模板上下文
模板上下文包含很多变量 包括通过render_template传入的变量
模板内置变量 用set设置
{% set name = tom %}
设置模板数据为变量
{% set name %}
age
{% endset %}
模板全局变量
config : flask当前配置对象
request : 请求对象
session : 回话对象
g : 请求的变量
jinjia2内置有全局函数 range( ) dict( )用法和python相同
url_for( )用于生成该url函数
get_flashed_messages( )用于获取flash消息的函数
还可以自定义上下文变量 使用app.context_processor装饰器 注册上下文处理函数 使用时传入参数 返回处理后的value值
使用
@app.context_processor
def num(num):
num = num+1
return num
还可以使用app.template_global 自定义全局函数 用法和自定义上下文变量相似
过滤器
jinjia2 在传入参数的时候 有一个过滤器 可以将传入的参数过滤
常见的内置过滤器有
过滤器 | 用法 |
---|---|
default | 默认值 |
first | 第一个元素 |
last | 最后一个元素 |
length | 变量的长度 |
random | 随机元素 |
safe | 不转义输入的变量 |
max | 最大值 |
min | 最小值 |
在约定中一般过jinjia2 没有使用sfae过滤器 避免用户的输入为危险变量 如果 设置了过滤器 safe 则按输入输出参数
jinjia2 还支持自定义过滤器 使用template_filter 装饰器 将函数设置为全局过滤器
例
@app.template_filter()
def name(s):
name = 'hello ' + 'name'
return name + Markup('hello')
这个过滤器就是将过滤传入的参数加一个hello Markup是为了将字符转换为安全字符
测试器
jinjia2 中包含测试器 为了判断一个变量或者表达式是否符合要求 符合则返回True 反之则False
例
{% if num is number %}
the num is {{num}}
{% else %}
not number
{% endif %}
常见内置测试器
none : 是否为none
number : 是否为数字
string : 是否为字符串
jinjia2还支持自定义测试器 使用装饰器app.template_test
例
@app.template_test()
def num_is_1(num):
if num == 1:
return True
else:
return False
添加全局
我们可以在固定的文件中 像添加全局配置文件那样配置全局对象 全局函数 全局过滤器 全局测试器
添加全局测试器可以舍弃全局对象 函数 过滤器 测试器的装饰器 而且易于导入
1.添加全局对象
app.jinjia_env.globals[‘全局函数名’] = 函数名
app.jinjia_env.globals[‘全局对象名’] = 对象名
2.添加全局过滤器
app.jinjia_env.fiter[‘全局过滤器名’] = 过滤器函数
3.添加全局测试器
app.jinjia_env.test[‘全局测试器名’] = 测试器函数
模板宏/函数
jinjia2 的模板宏类似于python的函数 多次使用同一个函数的时候可以以此定义
例
{% macro name(name)%}
{% if name%}
hello {{ name }}
{% else %}
hello boy
{% endif %}
{% endmacro %}
此函数名称name 如果 存在就 hello {{ name }} 如果不存在就hello boy 使用 macro 是声明块为 宏/函数 按照约定在最后使用 endmacro
使用时只需{{name(name)}} 就可以了
局部模板和模板继承
局部模板用于导入模板使用 大多用于个性化操作 比如用户的个性化壁纸等
局部模板仅包含部分内容 当程序中的视图函数处理ajax时 可以返回局部模板 可以使用
{% include ‘_base.html’ %} 导入局部模板
而模板继承用于在web的头和尾一般不会变化 如果在每个html文件中都插入头和尾 未免增加了内存量 而且工作量也会大大增加
使用模板继承时 首先定义基模板
{% block head %}
{% endblock %}
此处我定义了block基模板 约定在最后使用endblock结束
在子模板中使用时要
{% extends ‘base.html’ %}
导入基模板
子模板操作类型有覆盖和继承
如果子模板和基模板都含有同名的块 可以执行以下操作
1.覆盖 如果含有同名的块 则覆盖基模板内容
2.追加 如果在子模板中 添加函数{{ super() }} 则子模板内容会追加到基模板中
静态文件
flask的静态文件放在static中 html使用url_for(‘static’,filename=‘photo.jpg’) 引用静态文件
用户可以通过 /static/
还可以添加favicon.ico文件
favoicon文件为宽高相等的格式文件 命名为favicon.ico 而且 png 和gif文件也被主流浏览器识别
使用方式为
{% elif type == 'js' %}
{% elif type == 'icon' %}
{% endif %}
{% endmacro %}
消息闪现
flask提供flash作为消息闪现的函数
使用方式为在视图函数中使用flash(‘消息闪现的内容’) 在模板中使用get_flashed_message( )获取消息并闪现出来
自定义错误页面
在template中创建404 和 500 .html 文件可以自定义错误页面
可以使用@app.errorhandler(404/500) 来为函数处理错误的请求
然后return render_template(‘errors/404.html’),404 渲染404.html 文件和404状态码
异常错误的属性
code : 状态码
name : 错误的原因
description : 错误描述
还可以用装饰器 app.errorhandler(错误类型) 处理错误
以上为最近所学笔记总结
资料来源于李辉-flask开发实战 若侵权 请联系
qq : 1759435876
微信 : 17711405764
我将第一时间删除并道歉 谢谢 !