开发环境:win7 pycharm
打开pycharm开发工具,新建flask项目:
新建完成后,已经是一个完成的hello world,运行即可看见效果。
官方文档的快速入门,我们可以学习一些常见的路由、动态规则等一些简单的入门。
如果不使用模板:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
user = { 'nickname': 'Miguel' } # fake user
return '''
<html>
<head>
<title>Home Page</title>
</head>
<body>
<h1>Hello, ''' + user['nickname'] + '''</h1>
</body>
</html>
'''
if __name__ == '__main__':
app.run()
如果你需要改变你的网站布局,在一个大的应用程序,该应用程序有几十个视图,每一个直接返回HTML?这显然不是一个可扩展的选择。故而我们需要使用模板。
引入模板
能够保持你的应用程序与网页的布局或者界面逻辑上是分开的,这样不是显得更加容易组织。
让我们编写第一个我们的模板(文件 templates/index.html):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title {{ title }}</title>
</head>
<body>
<h1>Hello, {{ user.nickname }}</h1>
</body>
</html>
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/')
def index():
user = { 'nickname': 'Miguel' } # fake user
return render_template('index.html', title='first page', user = user)
if __name__ == '__main__':
app.run()
模板中控制语句
Jinja2 模板同样支持控制语句,像在 {%…%} 块中。在index.html模板中修改如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% if title %}
<title>{{ title }} </title>
{% else %}
<title>Title </title>
{% endif %}
</head>
<body>
<h1>Hello, {{ user.nickname }}</h1>
</body>
</html>
在指向模板的参数中,不输入title:
return render_template('index.html', user = user)
现在我们的模板变得更加智能了。如果视图函数忘记输入页面标题的参数,不会触发异常反而会出现我们自己提供的标题。放心地去掉视图函数中 render_template 的调用中的 title 参数。
模板中的循环语句
登录的用户想要在首页展示他的或者她的联系人列表中用户最近的文章:
模拟数据传入:(用一个列表模拟从数据库中读取到的数据)
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
user = { 'nickname': 'Miguel' } # fake user
posts = [ #fake array of posts
{
'author':{'nickname':'John'},
'body':'Beautiful day in Portland'
},
{
'author':{'nickname':'Susan'},
'body':'The Avengres movies was so cool'
}
]
return render_template('index.html', user = user, posts = posts)
if __name__ == '__main__':
app.run()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% if title %}
<title>{{ title }} </title>
{% else %}
<title>Title </title>
{% endif %}
</head>
<body>
<h1>Hello, {{ user.nickname }}</h1>
{% for post in posts %}
<p>{{ post.author.nickname }} says: {{ post.body }}</p>
{% endfor %}
</body>
</html>
模板继承
在我们的 microblog 应用程序中,在页面的顶部需要一个导航栏。在导航栏里面有编辑账号,登出等等的链接。
我们可以在 index.html 模板中添加一个导航栏,但是随着应用的扩展,越来越多的模板需要这个导航栏,我们需要在每一个模板中复制这个导航栏。然而你必须要保证每一个导航栏都要同步,如果你有大量的模板,这需要花费很大的力气。
相反,我们可以利用 Jinja2 的模板继承的特点,这允许我们把所有模板公共的部分移除出页面的布局,接着把它们放在一个基础模板中,所有使用它的模板可以导入该基础模板。
所以让我们定义一个基础模板,该模板包含导航栏以及上面谈论的标题(文件 templates/base.html):
<html>
<head>
{% if title %}
<title>{{title}} - microblog</title>
{% else %}
<title>microblog</title>
{% endif %}
</head>
<body>
<div>Microblog: <a href="/index">Home</a></div>
<hr>
{% block content %}{% endblock %}
</body>
</html>
在这个模板中,我们使用 block 控制语句来定义派生模板可以插入的地方。块被赋予唯一的名字。
接着现在剩下的就是修改我们的 index.html 模板继承自 base.html
{% extends "base.html" %}
{% block content %}
<h1>Hello, {{ user.nickname }}</h1>
{% for post in posts %}
<p>{{ post.author.nickname }} says: {{ post.body }}</p>
{% endfor %}
{% endblock %}
原文地址:http://www.pythondoc.com/flask-mega-tutorial/templates.html