Flask的view层其实就是MVC中的V,即模板,使用Jinja2模板引擎
模板继承举例代码:
run.py

#!/usr/bin/env python
#encoding:utf-8
from flask import Flask
from flask import render_template

app = Flask(__name__)

@app.route('/hello/')
@app.route('/hello/<name>/<xm>')
def hello(name=None,xm=None):
    return render_template('hello.html' , name = name , xm = xm)

run.py里面定义的函数hello()并不是直接返回结果,而是使用render_template()方法渲染模板,第一个参数传'hello.html'指向你想渲染的模板名称,第二个参数'name'、第三个参数'xm'是传到模板去的变量,变量可以传多个。

模板hello.html在当前目录下的子目录templates(注意,一定要使用这个名字,Pycharm在新建flask项目的时候会自动创建static和template目录)。然后在templates目录下创建文件hello.html,内容如下:
hello.html

{% extends 'header.html' %}
{% block head %}

    {% if name %}
    <h1>hello name:{{ name }}---{{ xm }}</h1>
    {% else %}
        <h1>Hello World Flask</h1>
    {% endif %}

{% endblock head %}

{% block foot %}
{% endblock foot %}

在templates目录下创建header.html文件,内如如下
header.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>hi flask test</title>
</head>
<body>
<div align="center">
    这里是header头部
{% block head%}
{% endblock %}
</div>

{% block foot%}
{% endblock %}
<div align="center">
<p>---------------------------</p>
这里footer底部
</div>
</body>
</html>

运行结果如下:
hello.png

hello.html和header.html就是两个HTML模板,根据name变量的值,显示不同的内容。变量或表达式由”{{ }}”修饰,而控制语句由”{% %}”修饰,其他的代码,就是我们常见的HTML;
使用extends 'header.html',让hello.html继承header.html的内容
Jinja2的模板引擎还有更多强大的功能,包括for循环,过滤器等。模板里也可以直接访问内置对象如request, session等继承;

HTML自动转义:

#!/usr/bin/env python
#encoding:utf-8
from flask import Flask, Markup
from flask import render_template

app = Flask(__name__)

@app.route('/')
def index():
    return Markup('<div>Hello %s 2017</div>') % '<em>Flask</em>'

if __name__ == '__main__':
    app.run(host='0.0.0.0',port=8080,debug=True)

运行结果如下:
zy.png

”em”标签显示在页面上了,没用被执行,即去除了html标签,Markup还有很多方法,比如”escape()”呈现HTML标签, “striptags()”去除HTML标签。

#!/usr/bin/env python
#encoding:utf-8
from flask import Flask

app = Flask(__name__)
@app.route('/')
def index():
    return '<div>Hello %s 2017</div>' % '<em>Flask</em>'

if __name__ == '__main__':
    app.run(host='0.0.0.0',port=8080,debug=True)

运行结果如下:
z.png
em斜体标签被最执行了,Markup应根据实际场景灵活使用。

带符号 * 的表示必填项