在Flask中,配套的模板是Jinja2
Jinja2模板简介
渲染模板的方法
- render_template()
from flask import render_template //导入
@app.route('/')
def he():
print(url_for("hello",aid=2,name="ABCDE",pwd="98765"))
return render_template("index.html")
//默认会在templates目录下找模板文件
//也可以设置模板文件的位置
//app = Flask(__name__,template_folder="D:\pipenv\venv\demo")
- render_templates_string()
return render_template_string('<h1 style="color:red;">红</h1>')
模板传参
- 如果只有一个或者少量参数,直接在
render_template
函数中添加关键字参数就可以了
return render_template("index.html", title="我是标题")
- 如果有多个参数的时候,那么可以先把所有的参数放在字典中,然后在
render_template
中调用
@app.route('/')
def he():
content = {
'title':"我是标题",
'username':'linlinlin'
}
return render_template("index.html", **content)
//注意:这里的 **可以把字典转换成关键参数传递进去,方便使用和管理
在模板中使用 :{{ title }}
- 传递多个参数也可以不加 ** ,但是使用的时候稍许麻烦.在模板中:{{content.title }}
return render_template("index.html", content=content)
- 列表,字典传参
'books': {
'python': 23,
'java': 33,
'php': 39
},
"list":['a','b','v','d']
模板中的使用
<p>{{ books.python}}</p>
<p>{{ books.values }}</p>
<p>{{ list.1 }}</p>
<p>{{ list[2] }}</p>
Jinja2模板过滤器
过滤器可以处理变量,把原始的变量经过处理后再展示出来
例如:{{ name|length }},将返回name的长度。
-
length(value):返回序列或字典的项数
-
abs(value) :返回数值的绝对值
-
default(value,default_value,boolean=false)
如果当前变量没有值,则会使用参数中的值来代替。value为None时,也会被代替。 -
first(value):返回一个序列的第一个元素
-
format(value,*arags,**kwargs):格式化字符串
{{ "%s" - "%s"|format('Hello',"World") }}输出:Hello - World
- last(value):返回一个序列的最后一个元素。
- join(value,d=’++’):将一个序列用d这个参数的值拼接成字符串。
{{ list | join('++') }}
输出:a++b++c++d
- safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。
- escape 或 e 转义字符,会将<、>等符号转为HTML中的符号.例如:strrr|e
关闭转义
{% autoescape off %}
{{ es }}
{% endautoescape %}
- int(value):将值转换为int类型。
- float(value):将值转换为float类型。
- lower(value):将字符串转换为小写。
- upper(value):将字符串转换为大写。
- replace(value,old,new): 替换将old替换为new的字符串。
- truncate(value,length=100,killwords=False):截取length长度的字符串。
- striptags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。
- trim(value):截取字符串前面和后面的空白字符。
- string(value):将变量转换成字符串。
- wordcount(value):计算一个长字符串中单词的个数。
更多点这里
自定义过滤器
from datetime import datetime
"now_time":datetime(2020,4,11,5,0,0)
@app.template_filter("handle_time")
def my_time(time):
if isinstance(time,datetime):
now=datetime.now();
# .total_seconds()得到总秒数
timestamp=(now-time).total_seconds()
if timestamp <60:
return "一分钟内"
elif timestamp>=60 and timestamp<=60*60:
return "%s分钟之前" % int(timestamp/60)
elif timestamp>=60*60 and timestamp<=60*60*24:
return "{}小时之前".format(int(timestamp/60/60))
else:
return time
-----------------------------------------------
<p>距离2020年4月11日5时相差{{ now_time | handle_time }}</p>
控制语句
if else
{% if username=="sang" %}
{{ username }}
{% else %}
<p>我不是sang</p>
{% endif %}
for in
<ul>
{% for user in list %}
<li>{{ user }}</li>
{% endfor %}
</ul>
遍历字典
<ul>
{% for key,value in books.items() %}
<li>{{ key }}:{{ value }}</li>
{% endfor %}
</ul>
Jinja中的for循环还包含以下变量,可以用来获取当前的遍历状态
loop.index:当前迭代的索引(从1开始)
loop.index0:当前迭代的索引(从0开始)
loop.first:是否为第一次迭代,返回True或False
loop.last:是否为最后一次迭代,返回True或False
loop.length:序列的长度
宏与import
类似python中的函数,但没有返回值。
//定义
{% macro hhh(name,type='text',value='') %}
<input type="{{ type }}" ,name="{{ name }}",value="{{ value }}">
{% endmacro %}
- import…as…形式调用
import导入宏
{% import "marco.html" as macro %}
{{ macro.hhh('password',type="password") }}
- from…import…as…/from…import…形式调用
{% from "macro.html" import hhh %}
{{ input("password",type="password") }}</td>
include和set
include可以把一个模板引入到另一个模板中
{% include "macro.html " %}
set赋值语句
全局:{% set name="XXX" %}
局部:
{% with %}
{% set name="XXX" %}
{% endwith %}
{% with name="XXX" %}
{{name}}
{% endwith %}
模板继承
flask中的模板可以继承,通过在父模板中定义 block
,子模板继承了父模板的block
,也可以去重写。
- 子模板可以重写父模板,可以在
block
里面加标签,在不属于父模板block
内添加标签是不显示的 - 子模板不能继承多个父模板
- 可以嵌套模板
{% extends "base.html" %}
{% block demo %}
//子类可以在这里重写内容,也可以不重写,直接使用父类的
{% endblock %}
静态文件的配置
在falsk中使用 css,js,image等等这些使页面美观的东西全部放在 static文件夹中,我们使用的时候直接使用 url_for
调用
<link href="{{ url_for('static',filename='demo.css') }}">
url_for默认在static文件夹下找demo.css文件。
我们也可以设置默认查找位置不在static文件夹下,指定一下位置就好了
app = Flask(__name__,static_folder='e:\demo')