Flask-模板渲染与继承
一.模板渲染
使用render_template()方法来渲染模板。第一个参数是模板名字符串,模板变量以关键字参数的方式传入。
这里有一个展示如何渲染模板的简例:
#coding:utf-8
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
if __name__ == '__main__':
app.run()
Flask 会在 templates 文件夹里寻找模板,request、session、g对象以及get_flashed_messages()函数不需要作为参数传入传入,在模板里可以直接访问。此外,模板的自动转义功能默认是开启的,所以如果传入的变量包含 HTML ,它将会被自动转义。如果你能信任一个变量,并且你知道它是安全的,你可以用 Markup 类或 |safe 过滤器在模板中把它标记为安全的。以name变量为例,
Markup类的使用:
# coding:utf-8 from flask import Flask,render_template,Markup @app.route(/test/<name>) def test(name=None): return render_template('test.html',name = Markup(name))
二、模板继承
模板继承允许你创建一个基础的骨架模板, 这个模板包含您网站的通用元素,并且定义子模板可以重载的 blocks 。
基础模板base.html
<!doctype html>
<html>
<head>
{% block head %}
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
<title>{% block title %}{% endblock %} - My Webpage</title>
{% endblock %}
</head>
<body>
<div id="content">{% block content %}{% endblock %}</div>
<div id="footer">
{% block footer %}
© Copyright 2010 by <a href="http://domain.invalid/">you</a>.
{% endblock %}
</div>
</body>
子模板负责填充空白的 block,基础模板使用{% block %} 标签定义了四个子模板可以重载的块。block标签所做的所有事情就是告诉模板引擎: 一个子模板可能会重写父模板的这个部分。
子模板test.html
{% extends "layout.html" %}
{% block title %}Index{% endblock %}
{% block head %}
{{ super() }}
<style type="text/css">
.important { color: #336699; }
</style>
{% endblock %}
{% block content %}
<h1>Index</h1>
<p class="important">
Welcome on my awesome homepage.
{% endblock %}
{% extends %}是这个例子的关键,它会告诉模板引擎这个模板继承自哪一个模板, 模板引擎分析这个模板时首先会定位其父模板。extends 标签必须是模板的首个标签。如果改写父模板block标签里的内容,使用标签{% block 块名%} 添入的新内容 {% endblock% },如果改写父模板block是想在原有基础上添加新内容,则可以使用{{ super() }}来继承,{% block 块名%} {{ super() }} 添入的新内容{% endblock%}