第3章 模板

3.1 JinJa2模板引擎
示例3-1,示例3-2两个模板可以直接在记事本里面输入后保存为html格式,放到flasky文件夹下面的templates文件夹中。
3.1.1渲染模板示例3-3:
from flask import Flask, render_template
from flask_script import Manager

app = Flask(__name__)

manager = Manager(app)

@app.route('/')
def index():
return render_template('index.html')

@app.route('/user/<name>')
def user(name):
return render_template('user.html', name=name)

if __name__ == '__main__':
manager.run()

应该用python hello.py runserver命令来启动Web服务器。

3.1.2变量
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 object's method: {{ myobj.somemethod() }}.</p>
可以使用过滤器修改变量,过滤器名添加在变量名之后,中间使用竖线分隔。例如,下述
模板以首字母大写形式显示变量 name 的值:
Hello, {{ name|capitalize }}

过滤器名 说明
safe 渲染值时不转义
capitalize 把值的首字母转换成大写,其他字母转换成小写
lower 把值转换成小写形式
upper 把值转换成大写形式
title 把值中每个单词的首字母都转换成大写
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的 HTML 标签都删掉
3.1.3控制结构
Jinja2 提供了多种控制结构,可用来改变模板的渲染流程。比如if条件控制、for循环、macro宏(类似于函数);还可以把宏保存在单独的文件中,然后在需要的模板中导入、重用;需要在多处重复使用的模板代码片段也可以写入单独的文件,再包含在所有模板中,以避免重复。模板继承是另一种重复使用代码的强大方式。
3.2使用Flask-Bootstrap集成Twitter Bootstrap
Bootstrap(http://getbootstrap.com/)是 Twitter 开发的一个开源框架。
flask-bootstrap是一个Flask扩展,使用pip安装:
pip install flask-bootstrap
示例3-4
#在创建时初始化flask_bootstrap
from flask import Flask, render_template
from flask_script import Manager
from flask_bootstrap import Bootstrap

app = Flask(__name__)

manager = Manager(app)
bootstrap = Bootstrap(app)

@app.route('/')
def index():
return render_template('index.html')

@app.route('/user/<name>')
def user(name):
return render_template('user.html', name=name)

if __name__ == '__main__':
manager.run()

运行结果如下:

3.3自定义错误页面
最常用的错误代码:404,客户端请求未知页面或路由时显示;500,有未处理的异常时显示。
为其指定自定义处理程序的方式:
示例3-6
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404

@app.errorhandler(500)
def internal_server_error(e):
return render_template('500.html'), 500

flask-bootstrap提供了一个具有页面基本布局的基模板,我们可以继承该模板来定义一个具有更完整页面布局的基模板,其中包含导航条,而页面内容则可留到衍生模板中定义。
base.html第一行命令继承bootstrap的基模板:{% extends "bootstrap/base.html" %}
404.html第一行命令继承base.html模板{% extends "base.html" %}
3.4链接
url_for()函数可以使用程序URL映射中保存的信息生成URL。
例如:
url_for('index')#返回 /
url_for('url', name='hohn', _external=True)#返回http://localhost:5000/user/john。
3.5静态文件
默认设置下,Flask 在程序根目录中名为 static 的子目录中寻找静态文件。如果需要,可在static 文件夹中使用子文件夹存放文件。服务器收到前面那个 URL 后,会生成一个响应,包含文件系统中 static/css/styles.css 文件的内容。
3.6 使用Flask-Moment本地化日期和时间
moment.js库(http://momentjs.com/),它可以在浏览器中渲染日期和时间。Flask-Moment 是一个 Flask 程序扩展,能把moment.js 集成到 Jinja2 模板中。Flask-Moment 可以使用 pip 安装:
(venv) $ pip install flask-moment
初始化方法:
示例 3-11 hello.py:初始化 Flask-Moment
from flask_moment import Moment
moment = Moment(app)

示例 3-12 展示了如何在基模板的 scripts 块中引入这个库。
示例 3-12 templates/base.html:引入 moment.js 库
{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{% endblock %}

示例 3-13 hello.py:加入一个 datetime 变量
from datetime import datetime
@app.route('/')
def index():
return render_template('index.html',
current_time=datetime.utcnow())
示例 3-14 展示了如何在模板中渲染 current_time 。
代码 3-14 templates/index.html:使用 Flask-Moment 渲染时间戳
< p>The local date and time is {{ moment(current_time).format('LLL') }}.</p>
<p>That was {{ moment(current_time).fromNow(refresh=True) }}</p>

完整代码:
from datetime import datetime
from flask import Flask, render_template
from flask_script import Manager
from flask_bootstrap import Bootstrap
from flask_moment import Moment

app = Flask(__name__)

manager = Manager(app)
bootstrap = Bootstrap(app)
moment = Moment(app)

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

@app.errorhandler(500)
def internal_server_error(e):
return render_template('500.html'), 500

@app.route('/')
def index():
return render_template('index.html',
current_time=datetime.utcnow())

@app.route('/user/<name>')
def user(name):
return render_template('user.html', name=name)

if __name__ == '__main__':
manager.run()
Flask-Moment 实现了 moment.js 中的 format() 、 fromNow() 、 fromTime() 、 calendar() 、 valueOf()和 unix() 方法。详细见文档(http://momentjs.com/docs/#/displaying/)。


学到这里,感觉学不下去了,感觉身体被掏空......难道这是黎明前的黑暗吗?



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值