[译]Flask教程-模版
我们可以让绑定到某个URL的函数返回HTML. 比如下面的代码中, hello()
函数会返回由<h1>
包裹的Hello World字符串.
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<html><body><h1>Hello World'</h1></body></html>' if __name__ == '__main__': app.run(debug = True)
但大家看得出, 这样直接通过python代码返回HTML内容显得很笨, 尤其当我们碰到需要对输入变量做条件判断和循环时, 我们经常需要做字符串嵌入拼接这种体力活.
这种情况下, 我们需要利用Flask自带的Jinja2模版引擎. 我们可以通过render_template()
来渲染HTML文件, 而不是直接把HTML直接硬编码在python代码中. 比如:
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return render_template(‘hello.html’) if __name__ == '__main__': app.run(debug = True)
Flask会默认尝试从脚本执行目录下的templates文件夹中寻找HTML模版文件,
--脚本目录 |_ Hello.py |_ templates |_hello.html
"web模版系统" 是指一个变量部分可以被动态替换的HTML代码的系统. web模版系统包含一个模版引擎, 一种数据源, 和一个模版处理工具.
Flask使用Jinja2模版引擎, web模版包含有按HTML语法书写的脚本和由变量或表达式构成的动态内容的占位符. 这些占位符会在模版渲染时被替换成需要展示的动态内容.
我们可以把如下内容保存为hello.html:
<!doctype html> <html> <body> <h1>Hello {{ name }}!</h1> </body> </html>
然后运行下面的Python代码:
from flask import Flask, render_template app = Flask(__name__) @app.route('/hello/<user>') def hello_name(user): return render_template('hello.html', name = user) if __name__ == '__main__': app.run(debug = True)
服务器在开发模式下开始运行之后, 我们打开浏览器在地址栏输入 http://localhost:5000/hello/mvl
.
我们可以看到在模版的{{ name }}
部分, 替换成了变量mvl
.
Jinja2使用如下的占位符语法:
{% ... %}
声明{{ ... }}
用于表达式直接把结果输出{# ... #}
用于注释, 将不会在模版引擎渲染结果中输出# ... ##
行注释
下面的例子展示了模版中条件语句的使用.
hello_name()方法接收一个整型参数, 传递给hello.html模版, 其中, masks变量接受到了这个整型变量, 并进行判断比较, 是否大于50, 然后进行不同的渲染.
Python程序如下:
from flask import Flask, render_template app = Flask(__name__) @app.route('/hello/<int:score>') def hello_name(score): return render_template('hello.html', marks = score) if __name__ == '__main__': app.run(debug = True)
模版hello.html如下:
<!doctype html> <html> <body> {% if marks>50 %} <h1> Your result is pass!</h1> {% else %} <h1>Your result is fail</h1> {% endif %} </body> </html>
注意, if-else和endif语句被包裹在{%..%}
之中.
启动脚本并分别在浏览器输入http://localhost/hello/60
和 http://localhost/hello/30
, 观察模版不同的渲染结果.
Python中的循环语法也可以在模版中实现. 下面的程序中, 当请求 http://localhost:5000/result 时, result()方法就向模版result.html发送了一个字典对象用于渲染. 然后result.html使用for循环把字典result的键值对渲染到html表格中.
Python程序如下:
from flask import Flask, render_template app = Flask(__name__) @app.route('/result') def result(): dict = {'phy':50,'che':60,'maths':70} return render_template('result.html', result = dict) if __name__ == '__main__': app.run(debug = True)
把下面result.html模版文件保存到默认templates模版文件夹中.
<!doctype html> <html> <body> <table border = 1> {% for key, value in result.iteritems() %} <tr> <th> {{ key }} </th> <td> {{ value }} </td> </tr> {% endfor %} </table> </body> </html>
这里, for循环声明语句被用{%..%}
包裹了起来, 键值对取值的部分被用{{ }}
包裹.
程序开始执行后, 我们可以打开浏览器, 看看 http://localhost:5000/result
的输出.