模板
个人拙见:所谓模板就是就是模具,模型;我们现实生活中经常碰到这种东西,就比如说厂家要批量生产一种钢化杯子,那么厂家肯定是先建模,设计出一个杯子的模型,并在此基础上做出模具,之后的生产,只需要将冶炼好的金属注入其中即可。我们学习的模板就类似于这种模具,只不过我们这里的是 web 模板。模板的诞生是为了将显示与数据分离,让前端工作人员专注表现设计,后台人员注重业务逻辑,同时简化代码的复杂程度。模板技术多种多样,但其本质是将模板文件和数据通过模板引擎生成最终的HTML代码。
渲染模板
所谓渲染模板,其实就是将数据插入到你的模板中,例如:
这是一个 user.html的文件
<h1>Hello, {{ name }}!</h1>
这是一个视图函数
from flask import Flask,render_template
@app.route('/user/<name>')
def user(name):
return render_template('user.html',name=name)
flask 提供的 render_template 函数将 Jinja2 模板引擎集成到了程序中。render_template 函数第一个参数是模板的文件名。随后的参数都是键值对,表示模板中变量对应的真实值,注意一下,这个 render_template 查询响应文件是有位置的,默认的是在当前脚本的同级目录的templates目录下,如果不是这个目录下的文件是查询不到的,需另行修改。(如图所示,我的视图函数在 manage 中,而我的响应文件则保存在 templates 中)
拿上面这个例子来举例,首先在 user.html 文件中有一个变量name,user这个函数的形参中也有一个变量 name 在响应的时候会将 user.html 中的name替换为user函数所接收到的参数,打个比方,如果访问的是’/user/tom’,那么这个时候,user.html 的显示效果就是 Hello,tom!
变量
上面的例子提到了变量,在模板中使用 {{ name }} 结构表示一个变量,它是一种特殊的占位符,告诉模板引擎这个地方要被替换为渲染时传递过来的数据。Jinja2 能识别所有类型的变量,例如列表,字典,对象等,例子见下:
<p>A value from a dirctionary: {{ mydict['key'] }}.</p>
<p>A value from a list: {{ mylist[2] }}.</p>
<p>A value from a list,with a variable index: {{ mylist[myintvar] }}.</p>
<p>A value from an object's method: {{ myobj.somemethod() }}.</p>
还可以使用过滤器修改变量,过滤器名添加在变量名之后,与变量名之间用竖线分隔。如下,为模板以首字母大写形式显示变量 name 的值
hello, {{ name|capitalize }}
Jinja2的常用过滤器
| 过滤器名 | 说明 |
|---|---|
| safe | 渲染时不转义 |
| capitalize | 把值的首字母转换成大写,其他字母转为小写 |
| lower | 把值转换为小写 |
| upper | 把值转换为大写 |
| title | 把值中每个单词首字母转换成大写 |
| trim | 把值的首尾空格去掉 |
| striptags | 渲染之前,把值中所有的HTML标签都删掉 |
safe 过滤器需要注意一下,默认情况下,出于安全考虑,Jinja2 会转义所有的变量。如果需要显示变量中存储的源码时,就可以考虑使用 safe 过滤器了。但需要切记的是,千万不可在不可信的值上使用 safe 过滤器,例如用户在表单输入的文本等。
控制结构
Jinja2提供了多种控制结构,可用来改变模板的渲染流程。语法:{% 语句 %} 具体例子见下:
条件控制语句:
{% if user %}
Hello ,{{ user }}!
{% else %}
Hello ,Stranger!
{% endif %}
循环控制:
<ul>
{% for comment iin comments %}
<li>{{ comment }}</li>
{% endfor %}
</ul>
Jinja2 还支持宏,类似于Python代码中的函数(本人还不是很理解,待续)
蓝图
一个功能完善的网站的目录结构是较为复杂的,这会给我们在处理响应的时候带来很大的麻烦,但有一个强大的工具让这个问题变的简单了,没错,就是蓝图。那么什么是蓝图呢?别着急,先看一个例子:
这是本人的一个项目目录结构,当然这只是其中一部分(其他无关紧要),admin 是后台,home 为前台;他们响应的 html 文件分别存在于 templates 下的 admin 和 home 中,但是大家看一下我的视图函数。
admin的 views
home 的 views
大家发现了没,我给两个函数的路由是一样的,但明显前后端的路由不可能会一样(并不是本人写错了 / 笑哭),这是怎么实现的呢?这就是蓝图的功效,ta 可以把整个目录结构分而治之,而且各个部分直接不会相互产生干扰,赶紧来看一下怎么做到的吧(这里用 admin 的进行举例)。
- 定义一个蓝图
- 注册蓝图
- 使用蓝图进行路由
因为我们在注册的时候给了一个地址 url_prefix=”/admin” ,其实对后台进行请求时的路由地址应该是由两个地址拼接起来的 “ /admin/ ”。
未完待续
本文介绍了 Flask 框架中的模板概念,包括模板渲染、变量使用、控制结构和蓝图。通过实例展示了如何在模板中插入数据、使用变量、过滤器以及条件和循环控制。此外,还探讨了蓝图在组织复杂项目结构中的作用,帮助理解和应用 Flask 的模板系统。
1477





