码迷,mamicode.com
首页 > 其他好文 > 详细

Flask学习之二——模板

时间:2015-05-21 10:47:37      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

1.Jinja2模板引擎

模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道。
使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。

默认情况下,Flask 在程序文件夹中的 templates 子文件夹中寻找模板.
Flask 提供的 render_template 函数把 Jinja2 模板引擎集成到了程序中。render_template 函数的第一个参数是模板的文件名。随后的参数都是键值对,表示模板中变量对应的真实值

-*- user.html

<h1>Hello, {{ name }}!</h1>
from flask import render_template
@app.route(/user/<name>)
def user(name):
    return render_template(user.html, name=name)

 

Jinja2能识别所有类型的变量,甚至是一些复杂的类型,例如列表,字典和对象。

<p>A value from a dictionary: {{ mydict[‘key‘]}}</p>
<p>A value from a list: {{ mylist[3] }}</p>
<p>A value from a list, with a variable index: {{ mylist[myintvar] }}</p>
<p>A value from an objects method: {{ myobj.somemethod }}</p>

可以使用过滤器修改变量

<h1>Hello, {{ name|capitalize }}</h1>

 

jinja2的控制结构

if

{% if user %}
    Hello, {{ user }}!
{% else %}
    Hello, Stranger!
{% endif %}

for

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

宏(macro)(类似函数)

{% 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 %}}
        {{ macros.render_comment(comment) }}
    {{% endfor %}}
</ul>

 

需要在多处重复使用的模板片段可以保存为单独的文件,然后再包含在所需的模板中(include

{{% include ‘common.html‘ %}}

 

另一种重复使用代码的方法是模板继承

-*- base.html

<html>
<head>
    {% block head %}
    <title>
        {% block title %}
        {% endblock %}
        - My Application
    </title>
    {% endblock %}
</head>
<body>
    {% block body%}
    {% endblock %}
</body>
</html>

block标签定义的元素可在衍生模板中修改

{% extends "base.html" %}
{% block title %}
    Index
{% endblock %}
{% block head %}
    {{ super() }}
{% endblock %}
{% block body %}
    <h1>Hello, World!</h1>
{% endblock %}

extends指明这个模板衍生自base.html
super()用于获取原来的内容

 

 

2. 使用Flask-Bootstrap集成Bootstrap 

初始化Flask-Bootstrap

from flask.ext.bootstrap import Bootstrap
bootstrap = Bootstrap(app)

 

初始化 Flask-Bootstrap 之后,就可以在程序中使用一个包含所有 Bootstrap 文件的基模板。
这个模板利用 Jinja2 的模板继承机制,让程序扩展一个具有基本页面结构的基模板,其中就有用来引入 Bootstrap 的元素。

-*-base.html

{% extends "bootstrap/base.html" %}

{% block title %}Flasky{% endblock %}

{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle"
            data-toggle="collapse" data-target=".navbar-collapse">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/">Flasky</a>
        </div>
        <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li><a href="/">Home</a></li>
            </ul>
        </div>
    </div>
</div>
{% endblock %}

{% block content %}
<div class="container">
    {% block page_content %}{% endblock %}
</div>
{% endblock %}
{% extends "base.html" %}

{% block title %}Flasky{% endblock %}

{% block page_content %}
<div class="page-header">
    <h1>Hello, {{ name }}!</h1>
</div>
{% endblock %}

extends指令从Flask-Bootstrap中导入bootstrap/base.html,从而实现模板继承
bootstrap/base.html提供了一个网页框架,引入了Bootstrap中的所有css和javascript
bootstrap/base.html定义了可以衍生模板中重定义的块(块里面的东西就跟普通的bootstrap没什么区别)

 

Flask-Bootstrap基模板中定义的块

技术分享

ps:很多块都是 Flask-Bootstrap 自用的,如果直接重定义可能会导致一些问题。
例如,Bootstrap 所需的文件在 styles 和 scripts 块中声明。如果程序需要向已经有内容的块中添加新内容,必须使用 Jinja2 提供的 super() 函数。
so,如果要在衍生模板中添加新的 JavaScript 文件,需要这么定义 scripts 块:

{% block scripts %}
    {{ super() }}
    <script type="text/javascript" src="my-script.js"></script>
{% endblock %}

 

 

3. 自定义错误界面

@app.errorhandler(404)
def page_not_found(e):
    return render_template(404.html), 404

 

 

4. 连接

在模板中直接编写简单路由的 URL 链接不难,但对于包含可变部分的动态路由,在模板中构建正确的 URL 就很困难。而且,直接编写 URL 会对代码中定义的路由产生不必要的依赖关系。如果重新定义路由,模板中的链接可能会失效。

为了避免这些问题,Flask 提供了 url_for() 辅助函数,它可以使用程序 URL 映射中保存的信息生成 URL。

url_for() 函数最简单的用法是以视图函数名(或者 app.add_url_route() 定义路由时使用的端点名)作为参数,返回对应的 URL。
例如,在当前版本的 hello.py 程序中调用 url_for(‘index‘) 得到的结果是 /。调用 url_for(‘index‘, _external=True) 返回的则是绝对地址,在这个示例中是 http://localhost:5000/。

使用 url_for() 生成动态地址时,将动态部分作为关键字参数传入
例如,url_for(‘user‘, name=‘john‘, _external=True) 的返回结果是 http://localhost:5000/user/john。

传入 url_for() 的关键字参数不仅限于动态路由中的参数。
函数能将任何额外参数添加到查询字符串中。例如,url_for(‘index‘, page=2) 的返回结果是 /?page=2

 

 

5. 静态文件

对静态文件的引用被当成一个特殊的路由,即 /static/<filename>。
例如,调用url_for(‘static‘, filename=‘css/styles.css‘, _external=True) 得 到 的 结 果 是 http://localhost:5000/static/css/styles.css。

默认设置下,Flask 在程序根目录中名为 static 的子目录中寻找静态文件。如果需要,可在static 文件夹中使用子文件夹存放文件。
服务器收到前面那个 URL 后,会生成一个响应,包含文件系统中 static/css/styles.css 文件的内容。

 

 

2015-05-21

Flask学习之二——模板

标签:

原文地址:http://www.cnblogs.com/whuyt/p/4518972.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!