Python Flask学习笔记之模板

Python Flask学习笔记之模板

Jinja2模板引擎

默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板。Flask提供的render_template函数把Jinja2模板引擎集成到了程序中。

渲染模板

创建文件夹

mkdir  app/templates

改写代码

# routes.py
from flask import render_template
from app import app

@app.route('/')
@app.route('/index')
def index():
    return "Hello, World!"
@app.route('/user/<name>')
def user(name):
    return '<h1>Hello, %s</h1>' % name
@app.route('/template')
def template_test():
    user = {'username':'Mark'}
    return render_template('template.html',user=user)

变量

# template.html
<h1>Hello, {{ user.username }}!</h1>

访问http://127.0.0.1:5000/template,显示Hello, Mark!

控制结构

  • 条件控制语句
{% if user %}
    Hello, {{ user }}
{% else %}
    Hello, Stranger!
{% endif %}
  • for循环
<ul>
    {% for comment in comment %}
        <li>{{ comment }}</li>
    {% endfor %}
</ul>
  • 宏,类似Python代码中的函数
{% macro render_comment(comment) %}
    <li>{{ comment }}</li>
{% endmacro %}

<ul>
    {% for comment in comments %}
        {{ render_comment(comment)}}
    {% endfor %}
</ul>

为了重复使用宏,可以将其保存在单独的文件中,然后在需要使用的模板中导入

{% import 'macros.html' as macros %}
<ul>
    {% for comment in comments %}
        {{ render_comment(comment)}}
    {% endfor %}
</ul>
  • 继承
# base.html
<!DOCTYPE html>
<html>
<head>
    {% if title %}
    <title>{{ title }} - mark</title>
    {% else %}
    <title>welcome to mark's blog</title>
    {% endif %}
</head>
<body>
    <div>mark's blog <a href="/index">Home</a></div>
    <hr>
    {% block content %}{% endblock %}
</body>
</html>
# index.html
{% extends "base.html"%}

{% block content %}
    <h1>Hi, {{ user.username }}!</h1>
    {% for post in posts %}
    <div><p>{{ post.author.username }} says: <b>{{ post.body }}</b></p></div>
    {% endfor %}
{% endblock %}

block控制语句用来定义派生模板可以插入代码的位置。 block被赋予一个唯一的名称,派生的模板可以在提供其内容时进行引用。extends语句用来建立了两个模板之间的继承关系,这样Jinja2才知道当要求呈现index.html时,需要将其嵌入到base.html中。 而两个模板中匹配的block语句和其名称content,让Jinja2知道如何将这两个模板合并成在一起。

posted @ 2019-02-28 17:37  mark-zh  阅读(435)  评论(0编辑  收藏  举报