Flask学习笔记之模板引擎Jinja2(四)

2016-06-21  本文已影响0人  容澄

随着程序内容改变,视图函数也有可能需要变化。模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。为了渲染模板,Flask 使用了一个名为 Jinja2 的强大模板引擎。

变量

{{ name }}结构表示一个变量,它是一种特殊的占位符,告诉模板引擎这个位置的值从渲染模板时使用的数据中获取。Jinja2 能识别所有类型的变量,甚至是一些复杂的类型,例如列表、字典和对象。

可以使用过滤器修改变量,过滤器名添加在变量名之后,中间使用竖线分隔。例如,{{ name|capitalize }} (capitalize first letter)。

过滤器名 说明
safe 渲染值时不转义
capitalize 把值的首字母转换成大写,其他字母转换成小写
lower 把值转换成小写形式
upper 把值转换成大写形式
title 把值中每个单词的首字母都转换成大写
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的 HTML 标签都删掉

控制标记

Jinja中2的控制标记包括:

# 条件判断
{% if user %}Hello, {{ user }}!
{% else %}Hello, Stranger!
{% endif %}

# 循环
<ul>{% for comment in comments %}
<li>{{ comment }}</li>{% endfor %}
</ul>

# macro (相当于function)
{% macro render_comment(comment) %}<li>{{ comment }}</li>
{% endmacro %}
<ul>{% for comment in comments %}
{{ render_comment(comment) }}{% endfor %}
</ul>

# 重复使用macro
{% import 'macros.html' as macros %}<ul>
{% for comment in comments %}{{ macros.render_comment(comment) }}
{% endfor %}</ul>

模板继承:

<!-- base.html 基础模板 --> 
<html> 
<head> 
    {% if title %} 
        <title>{{ title }} - microblog</title> 
    {% else %} 
        <title>Welcome to microblog</title> 
    {% endif %} 
</head> 

<body> 
    <div>Microblog: <a href="/index">Home</a></div> 
    <hr> 
    <!--black中间的内容会被子模板里的内容替代-->
    {% block content %}{% endblock %}   
</body>
</html>
<!-- index.html 子模板 -->
{% extends "base.html" %}
{% block content %} 
    <h1>Hi, {{ user.nickname }}!</h1> 
    {% for post in posts %} 
        <div><p>{{ post.author.nickname }} says: <b>{{ post.body }}</b></p></div> 
    {% endfor %}
{% endblock %}

参考资料:
The Flask Mega-Tutorial, Part II: Templates
Jinja2 简明使用手册
《Flask Web开发》

上一篇 下一篇

猜你喜欢

热点阅读