模板-Templates
什么是模板
模板是一个包含响应文本的文件(通常是html文件),该文件中允许包含"占位变量"来表示动态的内容,其具体值在请求中才能知道。"占位变量"最终会被真实的值所替换。模板最终也会被解析成响应的字符串,这一过程称为"渲染"。Flask实际上是使用 Jinja2 强大的模板引擎。
模板的设置
默认情况下,Flask会在程序文件夹中的 templates 子文件夹中寻找模板,需要手动创建 templates 文件夹。
渲染模板
在 视图函数中,通过return render_template()
将模板渲染成字符串再响应给客户端
render_template('xxx.html',arg1 = value1,arg2 = value2)
# 参数1:xxx.html,要渲染给客户端的html模板文件
# 参数2 ~ n:要传递给模板动态显示的变量占位符,如果没有动态的变量占位符,则可以省略
# 返回值:字符串
模板语法
变量
变量时一种特殊的占位符,告诉模板引擎该位置的值是从渲染模板时的数据中来获取的。变量类型可以是python中的任意数据类型。
- 在视图中
@app.route('/')
def index():
return render_template('xxx.html',name='sf.zh',age=18)
# name和age就是要传递到xxx.html中的变量
- 在模板中
{{变量名}}
{{params.变量名}}
变量的传递方式
- 直接传递
# 方式一,直接传递
@app.route('/temp')
def temp():
res = render_template('temp.html',
title = '关于本书',
bookName = '《钢铁是咋练成的》',
bookAuthor = '奥斯特洛夫斯基',
bookPrice = '32.5',
bookPlace = '北京大学出版社')
return res
- 将变量封装为字典
@app.route('/temp')
def temp():
bookInfo = {
'title':'关于本书',
'bookName':'《钢铁是咋练成的》',
'booAuthor':'奥斯特洛夫斯基',
'bookPrice':32.5,
'bookPlace':'北京大学出版社'
}
res = render_template('temp.html',params = bookInfo)
return res
- 利用
locals()
方法
@app.route('/temp')
def temp():
title = '关于本书'
bookName = '《钢铁是咋练成的》'
booAuthor = '奥斯特洛夫斯基'
bookPrice = 32.5
bookPlace = '北京大学出版社'
res = render_template('temp.html',params = locals())
return res
过滤器
什么是过滤器
过滤器是允许在变量输出显示之前改变变量的值
过滤器的语法
# 语法
{{变量|过滤器}}
# Jinja2 变量过滤器
# 过滤器名 说明
# capitalize 首字符变大写,其他字符变小写
# lower 把值转换成小写
# upper 把值转换成大写
# title 把值中的每个单词的首字符变大写
# trim 把值两端的空格去掉
控制结构
if 结构
{% if 条件 %}
# 满足条件要执行的代码
{% else %}
# 不满足条件要执行的代码
{% endif %}
for 结构
{% for 变量 in 元组|列表|字典 %}
{% endfor %}
宏
- 使用
{% macro %}
标签声明宏
{% mscro show(str) %}
{{str}}
{% endmacro %}
{{show(uname)}}
- 为了方便重复使用,允许将宏放在单独的模板文件中声明定义
{% macro show(str) %}
{{str}}
{% endmacro %}
{% macro show_li(str) %}
{{str}}
{% endmacro %}
{% import 'macro.html' as macros %}
{{ macros.show_li(uname) }}
模板的包含
在多处重复使用的模板代码可以放在单独的文件中,可以被其他的模板所包含(引用)
{% include 'xxx.html' %}
静态文件
什么是静态文件
在Flask中不能与服务器动态交互的文件都是静态文件,如:css,js,图片,音视频等
静态文件的处理
所有静态文件都保存在项目文件夹中的 static 文件夹中,在访问静态文件的时候需要通过 /static/资源路径
进行访问
# 正向解析
# 反向解析
url_for('static',filename='')
模板的继承
什么是模板的继承
模板的继承类似于类的继承,如果在一个模板中出现的大量内容是另外一个模板的话,那么就可以使用继承的方式来简化开发
语法
父模板
需要定义出哪些内容在子模板中是可以被重写的
{% block 块名 %}
{% endblock %}
# block:定义允许在子模板中被修改的内容
# 在父模板中正常显示,没有任何影响
# 在子模板中可以被重写
子模板
- 使用
{% extends '父模板名称' %}
来完成继承 - 使用
{% block 块名 %}
来重写父模板中的同名内容
{% block 块名 %}
# 覆盖掉父模板中的内容
{% endblock %}
# 允许通过 {{super()}} 来调用父模板中的内容
自定义错误页面
404.html
,500.html
等需要自定义
404错误处理
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'),404
500错误处理
@app.errorhandler(500)
def internal_server_error(e):
return render_template('500.html'),500
修改配置
app = Flask(__name__,
template_folder='muban',
static_url_path='/s',
static_folder='/sta')
template_folder # 设置模板的保存路径
static_url_path # 设置静态文件的访问路径(映射到WEB中的访问路径)
static_folder # 设置静态文件的保存目录(映射到项目中的目录名称)