Flask学习之二——模板

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

时间: 2024-10-31 01:24:29

Flask学习之二——模板的相关文章

Flask学习之二 模板

继续学习flask 本部分mega教程的翻译地址:http://www.pythondoc.com/flask-mega-tutorial/templates.html 一.为什么使用模板? 以下做一个小小的扩展:输出一个大标题. 一个容易的选择就是改变我们的视图功能,输出 HTML. 修改app/views.py 1 from app import app 2 3 @app.route('/') 4 @app.route('/index') 5 def index(): 6 user = {

Flask 学习(二)路由

Flask  路由 在说明什么是 Flask 路由之前,详细阐述下 Flask “Hello World” 这一 最小应用的代码. Flask “Hello World” 1 from flask import Flask 2 3 app = Flask(__name__) 4 5 @app.route('/') 6 def hello(): 7 return 'Hello World' 8 9 if __name__ = '__main__': 10 app.run() 剖析上述代码: 1.

flask学习(十):模板中访问模型和字典的属性

访问模型中的属性或者是字典,可以通过{{params.property}}的形式,或者是使用{{params['age']}}这样的形式 原文地址:https://www.cnblogs.com/cnhkzyy/p/9690688.html

Spring Boot学习记录(二)--thymeleaf模板

Spring Boot学习记录(二)–thymeleaf模板 标签(空格分隔): spring-boot 自从来公司后都没用过jsp当界面渲染了,因为前后端分离不是很好,反而模板引擎用的比较多,thymeleaf最大的优势后缀为html,就是只需要浏览器就可以展现页面了,还有就是thymeleaf可以很好的和spring集成.下面开始学习. 1.引入依赖 maven中直接引入 <dependency> <groupId>org.springframework.boot</gr

flask之二 模板相关

flask之二 模板相关 预热 在渲染模板的时候,默认会从项目根路径下的templates目录下查找模板 如果想要指定模板路径的时候,就在初始化APP的时候,这样操作即可: app = Flask(__name__,template_folder='C:/templates') #template_folder可以指定模板位置 模板传参 在使用render_template渲染模板的时候,可以传递关键字参数,以后直接在模板中使用就可以了 如果参数过多的话,那么就可以将所有的参数放到一个字典中,然

模板学习实践二 pointer

c++ template学习记录 使用模板将实际类型的指针进行封装 当变量退出作用域 自动delete // 1111.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" template <typename T> class Holder { private: T* ptr; // refers to the object it holds (if any) public: // default constructor: let the

Flask学习之五 用户登录

英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-v-user-logins 中文翻译地址:http://www.pythondoc.com/flask-mega-tutorial/userlogin.html 开源中国社区:http://www.oschina.net/translate/the-flask-mega-tutorial-part-v-user-logins 备注:我是三个一起看的,有些

Flask学习之六 个人资料和头像

英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vi-profile-page-and-avatars 中文翻译地址:http://www.pythondoc.com/flask-mega-tutorial/profile.html 开源中国社区:http://www.oschina.net/translate/the-flask-mega-tutorial-part-vi-profile-page-

【Flask教程11】模板

基本使用 过滤器&自定义过滤器 控制代码块 宏.继承.包含 Flask 的模板中特有变量和方法 web表单 CSRF 学习目标 能够写出 jinja2 中变量代码块和控制代码块的格式 能够写出在模板中字典,列表的取值方式 能够写出数组反转的自定义过滤器(使用1种方式即可) 能够说出Flask中模板代码复用的三种方式 能够使用代码实现模板继承的功能 能够说出可以在模板中直接使用的 Flask 变量和函数 能够使用 Flask-WTF 扩展实现注册表单 能够说出 CSRF 攻击的原理 一.Jinja