flask初探

为什么我们需要模板

让我们来考虑下我们该如何扩充我们这个小的应用程序。

我们希望我们的微博应用程序的主页上有一个欢迎登录用户的标题,这是这种类型的应用程序的一个“标配”。忽略本应用程序暂未有用户的事实,我会在后面的章节引入用户的概念。

输出一个漂亮的大标题的一个容易的选择就是改变我们的视图功能,输出 HTML,也许像这个样子:

from flask import Flask,url_for
app = Flask(__name__)
@app.route('/')
@app.route('/index')
def index():
    user = { 'nickname':'liuhuihuang' }
    return '''
<html>
    <head>
      <title>Home Page</title>
    </head>
    <body>
      <h1>hello,''' + user['nickname'] + '''</h1>
    </body>
</html>

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

运行结果如下:

flask初探

上面是直接在python中写html代码,下面这种就是开发过程中常用的模式

模板从天而降

如果你能够保持你的应用程序与网页的布局或者界面逻辑上是分开的,这样不是显得更加容易组织?难道你不觉得是这样吗?你甚至可以聘请一个网页设计师来设计一个杀手级的网页而你专注于 Python 编码。模板可以帮助实现这种分离。

让我们编写第一个我们的模板(文件 app/templates/index.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{title}} - microblog</title>
</head>
<body>
    <h1>hello,{{user.nickname}}</h1>
</body>
</html>

正如你在上面看到,我们只是写了一个大部分标准的HTML页面,唯一的区别是有一些动态内容的在 {{ ... }} 中。

现在看看怎样在我们的视图函数(文件 app/views.py)中使用这些模板:

from flask import Flask,url_for
from flask import render_template #引入render_template模块
app = Flask(__name__)
@app.route('/')
@app.route('/index')
def index():
    user = {'nickname':'parktrick'}
    return render_template("index.html",title = 'Home',user=user)
if __name__ == '__main__':
    app.run()

试着运行下应用程序看看模板是如何工作的。一旦在你的网页浏览器上呈现该网页,你可以浏览下 HTML 源代码,与原始的模板内容对比下差别,运行结果代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home - microblog</title>
</head>
<body>
    <h1>hello,parktrick</h1>
</body>
</html>

为了渲染模板,我们必须从 Flask 框架中导入一个名为 render_template 的新函数。此函数需要传入模板名以及一些模板变量列表,返回一个所有变量被替换的渲染的模板。

在内部,render_template 调用了Jinja2模板引擎,Jinja2 模板引擎是 Flask 框架的一部分。Jinja2 会把模板参数提供的相应的值替换了 {{...}} 块。