Flask Web开发 3.0 模板

本文深入探讨了Flask中用于构建易维护程序的关键技术——Jinja2模板引擎。通过分离业务逻辑和表现逻辑,提高了代码的可读性和可维护性。介绍了Jinja2模板的基本结构、变量的使用以及控制结构,还提到了如何利用Flask-Bootstrap集成Twitter Bootstrap,以美化网页,并讨论了静态文件和日期时间的本地化处理。
摘要由CSDN通过智能技术生成

想要开发出易于维护的程序,关键在于编写形式简洁且结构良好的代码。到目前为止我们接触到的示例都太简单,无法说明这一点,但Flask视图函数的两个完全独立的作用却被融合在了一起,这就会产生一个问题。

视图函数的作用很简单,即生成请求的响应。 对于简单的请求来说,这就足够了,但是一般而言,请求会改变程序的状态,而这种变化也会在视图函数中产生。

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

把业务逻辑和表现逻辑混在一起会导致代码难以理解和维护。假设要为一个大型表格构建一个HTML代码,表格中的数据由数据库中读取的数据以及必要的HTML字符串连接在一起。把表现逻辑移到模板中能够提升程序的可维护性。

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

3.1 Jinja2模板引擎

形式最简单的Jinja2模板就是一个包含响应文本的文件。下面的例子是一个Jinja2模板,它和第二章helloworld示例中的index()视图函数的响应一样。Jinja2模板要放在整个Flask Web 工程的templates文件夹里。

<h1>Hello world!</h1>
如果视图函数返回的响应中包含一个使用变量表示的动态部分,利用Jinja2也可以实现。
<h1>Hello,{
  { name }}!</h1>
3.1.1 渲染模板

默认情况下,Flask在程序文件夹的templates文件夹中寻找模板。在示例程序的下一个版本中,要把前面定义的两个模板放在templates文件夹下,分别命名为index.html和user.html。然后,我们需要改一下程序中的视图函数,以便渲染这些模板。

from flask import render_template
@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__':
    app.run(debug=True)
Flask提供的render_template函数把Jinja2模板引擎集成到了程序中,render_template函数的第一个参数是模板的文件名,随后的参数都是键值对,表示模板中的变量对应的真实值。在这段代码中第二个模板收到名为name的变量。其中左边的name表示参数名,就是模板中使用的占位符;右边是当前作用域中的变量,表示同名参数的值。

3.1.2 变量

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

  • safe:渲染值时不进行转义
  • capitalize:把值的首字母转换成大写,其他字母转换成小写
  • lower:把值转换成小写形式
  • upper:把值转换成大写形式
  • title:把值中的每个单词的首字母都转换成大写
  • trim:把值的首尾空格去掉
  • striptags:渲染之前把值中所有的HTML标签都删掉
safe过滤器值得特别说明一下,默认情况下,出于安全考虑,Jinja2会转义所有变量。例如,如果一个变量的值为"<h1>Hello</h1>",Jinja2会将其渲染成"&lt;h1&gt;Hello&lt;/h1&gt;",浏览器能够显示这个h1元素,但不会进行解释。很多情况下需要变量中存储的HTML代码,这时可使用safe过滤器。 
千万不要在不可信的值上使用safe过滤器,例如用户在表单中输入的文本,否则会造成安全隐患,如CSRF。
3.1.3 控制结构
Jinja2提供了多种控制结构,可用来改变模板的渲染流程。本节使用简单的例子介绍其中最有用的控制结构。下面的例子展示了如何在模板中使用条件控制语句:
{% if user %}
    Hello ,{
   { user }}!
{% else %}
    Hello,Stranger!
{% endif %}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值