模板

模板

视图函数的作用很明确,即生成请求的响应。一般而言,请求会改变程序的状态,而这种变化也会在视图函数中产生。

例如,用户在网站中注册了一个新账户。用户在表单中输入电子邮件地址和密码,然后点击提交按钮 。(表现逻辑) 服务器收到包含用户输入数据的请求,然后Flask把请求分发到处理注册请求的视图函数。这个视图函数需要访问数据库,添加新用户,然后生成响应回送给浏览器。(业务逻辑)

把业务逻辑和表现逻辑混在一起会导致代码难以理解和维护,把表现逻辑移到模板能够提升程序的可维护性。

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

Jinja2模板引擎
Flask提供的render_temokate函数把Jinja2模板引擎集成到了程序中。render_template函数的第一个参数是模板的文件名。随后的参数都是键值对,表示模板中变量对应的真实值。

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

可以使用过滤器修改变量,过滤器名添加在变量名之后,中间使用竖线分隔。例如,下述模板以首字母大写形式显示变量name的值:
Hello,{{name|capitalize}}

Jinja2部分常用过滤器
safe 渲染值时不转义
capitalize 首字母大写,其余小写
lower 全小写
upper 全大写
title 每个单词的首字母都转换成大写
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的HTML标签都删掉

控制结构
改变模板的渲染流程。

Jinja2还支持宏。宏类似于Python代码中的函数

需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板宏,以避免重复:

另一种重复使用代码的强大方式是模板继承,现新建一个名为base.html的基模板:

{ % block head % } { % block title % }{ % endblock % } - My Application { % endblock % } { % block body % } { % endblock % }

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

使用Flask-Bootstrap集成Twitter Bootstrap

Bootstrap 是Twitter开发的一个开源框架,它提供的用户界面,它提供的用户界面组件可用于创建整洁且具有吸引力的网页。

Bootstrap是客户端框架,因此不会直接涉及服务器。服务器需要做的只是提供引用了Bootstrap层叠样式表(CSS)和JavaScript文件的HTML响应,并在HTML,CSS和JavaScript代码中实例化所需组建。这些操作最理想的执行场所就是模板。

想要在程序中集成Bootstrap,显然要对模板做所有必要的改动。不过,更简单的方法是使用一个名为Flask-Bootstrap的Flask扩展,简化集成的过程。

初始化Flask-Bootstrap

#hello.py
from flask.ext.bootscript import Bootstrap
#...
bootstrap = Bootstrap(app)

Flask-Bootstrap中的基模板
{% extend "bootstrap/base.html"%}提供了一个网页框架,引入了Bootstrap中的所有CSS和JavaScript文件

基模板中定义了可在衍生模板中重定义的块。block和endblock指令定义的块中的内容可添加到基模板中。

Flask-Bootstrap基模板中定义的块
doc: 整个HTML文档
html_attribs 标签的属性
html 标签中的内容
head 标签中的内容
title 标签中的内容<br> metas 一组<meta>标签<br> styles 层叠样式表定义<br> body_attris <body>标签的属性<br> body <body>标签中的内容<br> navbar 用户定义的导航条<br> content 用户定义的页面内容<br> scripts 文档底部的JavaScript声明</p> <p>这些块都散Flask-Bootstrap自用的,如果直接重定义可能会导致一些问题。Bootstrap所需的文件在styles和scripts块中声明。如果程序需要向已经有内容的块中添加新内容,必须使用Jinja2提供的super()函数。例如,如果要在衍生模板中添加新的JavaScipt文件,需要这么定义scripts块:</p> <pre><code>{% block scripts %} {{ super() }} <script type="text/javascript" src = "my-script.js"></script> {% endblock %} </code></pre> <p>404,客户端请求未知页面或路由时显示;500,有未处理的异常时显示。<br> Flask支持自定义错误页面。</p> <pre><code>@app.errorhandler(404) def page_not_found(e): return render_template('404.html'),404#404.html是程序员写的模板 </code></pre> <h3 id="链接">链接</h3> <p>任何具有多个路由的程序都需要可以链接不同页面的链接<br> ,这可以通url_for()实现</p> <h3 id="静态文件">静态文件</h3> <p>Web 程序不是仅由Python代码和模板组成。大多数程序还会使用静态文件,例如HTML代码中引用的图片、JavaScript 源码文件和 CSS。</p> <p>默认情况下,Flask在程序根目录中名为static的子目录中寻找静态文件。</p> <h3 id="使用flask-moment本地化日期和时间">使用Flask-Moment本地化日期和时间</h3> <p>有一个使用JavaScipt开发的优秀客户端开源代码库,名为moment.js .它可以在浏览器中渲染日期和时间。Flask-Moment是一个Flask程序扩展,能把moment.js集成到Jinja2模板中。<br> 除了moment.js,Flask-Moment还依赖jquery.js</p>

posted @ 2018-02-13 18:38  blog_hfg  阅读(182)  评论(0)    收藏  举报