模板
flask使用jinja2渲染模板。
render_template()
render_template('*.html',参数)
方法可以让视图函数返回一个模板,就是HTML页面,模板的路径默认从template开始查找。render_template_string()
用来渲染字符串。
向模板传递参数
在前端页面中有许多参数据需要由后端传递,在html页面中用{{ }}
为数据预留位置。render_template()传递参数的方式有两种:
#test.html页面
<p>{{ name }}</p>
<p>{{ age }}</p>
#视图函数中:
#第一种方式:以键值对方式#
def func():
return render_template('test.html', name='Tom', age=19)
#第二种:字典参数#
def func():
args={'name':'Tom', 'age':19}
return render_template('test.html', **args)
模板中的流程语句:for,if
在模板中也可以使用佛for语句和if语句,使用语法和在python中一样,但是for和if的语句要放在{% %}
中。
#html中
{% if 条件 %}
html语句
{% else %}
html语句
{% endif %}
{% for i in 可遍历的对象 %}
html语句
{% endfor %}
过滤器
过滤器可以处理变量,把原始的变量处理后展示出来。
语法:
{{avatar|default('xxxx')}}
常用过滤器:
- default过滤器:如果当前变量未被定义,这时候可以指定默认值。
- length过滤器:求变量(列表字符串数组字典等)的长度
- capitaliz: 字母字符串首字母大写
- lower: 全部小写
- trim: 去除字符串前后的空白字符
- reverse:字符串反转
- format(): 格式化输出。
- 更多过滤器访问Jinja官方文档:http://jinja.pocoo.org/docs/dev/templates/#builtin-filters
自定义过滤器
过滤器其实就是一个函数而已,所以当内置过滤器无法满足需要时,可以自定义过滤器。
#首先定义一个函数
def func(l):
return l[:3] #返回传入列表的前三个值
#如何把这个函数变成一个过滤器呢?
#第一种方法,使用flask应用对象那个提供的“add_template_filter方法
app.add_template_filter(func,'func') #第一个参数为过滤器函数名,第二个参数为过滤器的名称,我们在模板中使用时就是使用则个名称
#第二种方法,使用装饰器,在定义函数时,添加上装饰器就可以了
@app.template_filter('func[过滤器名]')
def func():
pass
block-继承的用法
block是用来让子类html模板继承父类html模板的东西。把一些公共的代码放在父模板中,避免每个模板写同样的代码
{% extends 'xxx.html' %} #继承xxx.html模版
#在父模板中:
{% block name(接口名) %}{% endblock %} #为子html留下接口以便子模板添加内容
#子模板中:
{% block name(接口名) %}
代码体
{% endblock %} #在子模板中使用接口
加载静态文件
url_for('static', filename='路径')
flask加载静态文件是从static文件开始查找的
<img src="{{ url_for('static',filename='*.jpg' }}">
flask独有的标签内容
+定义变量
set定义的变量在页面内有效,with定义的变量只在with中有效
{% set name='Tom' %}
{% with age=20 %}
变量age: {{ age }}
{% endwith %}
+宏定义:macro
#在宏定义的页面中定义,以macro.html为例
{% macro myinput(name, value='', type='text') %}
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}
#在其他页面中引用
{% from 'macro.html' import myinput %}
<h4>登陆表单</h4>
<form action="">
用户名:{{ myinput('username') }}<br>
密 码:{{ myinput('password', type='password') }}
</form>
错误页面定制
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html')