业务逻辑和表现逻辑
将表现逻辑移到模板中,可以提升程序的可读性。
模板是一个包含响应文本的文件,包含站位变量表示的动态部分。
渲染:使用真实值替换模板中的变量,返回最终得到的响应字符串,这一过程称为渲染。
Flask使用Jinja2作为模板引擎。
简单的两个Jinja2模板:
#templates/index.html:
Hello World!
#templates/user.html:
Hello, {{ name }}!
程序测试:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/usr/')
def usr(name):
return render_template('user.html', name = name)
if __name__ == '__main__':
app.run(host='0.0.0.0',port=5000,debug=True)
可见,render_template的第一个参数是模板的文件名,第二个参数是变量对应的真实值,成为键值对。
谈谈变量:
前面用到的{{ name }}结构表示的变量,是一种特殊的占位符。
Jinja2能识别所有类型的变量,甚至列表、字典和对象。
可以使用过滤器过滤变量:
Hello, {{name|capitalize}}! #把值的首字母换成大写,其他字母换成小写。
常用的Jinja2变量过滤器。
控制结构:
Jinja2提供了多种控制结构,可以用来改变模板的渲染流程。
几个例子:
#if判断:
{% if usr %}
Hello,{{ usr }}!
{% else %}
Hello, Stranger!
{% endif %}
我对这个例子做了一些拓展,可以更好地理解相关内容:
{% if usr == 'Talen' or usr == 'Tale' %}
Hello,{{ usr }}!
{% else %}
Hello, Stranger!
{% endif %}
测试程序:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/if/')
def index(usr):
return render_template('if.html',usr = usr)
if __name__ == '__main__':
app.run(host='0.0.0.0',port=5000,debug=True)
假如传入的是Talen或者Tale,则打印会员;否则打印Stranger。
#for循环:
{% for comment in comments %}
- {{ comment }}
{% endfor %}
测试程序:
#for循环:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
comments = ['Talen','Tale','Tal']
return render_template('for.html',comments = comments)
if __name__ == '__main__':
app.run(host='0.0.0.0',port=5000,debug=True)
宏:
宏相当于一个函数。我们可以将宏保存在一个单独的文件中,从而达到重复使用的目的。
#宏
{% macro comment(comment) %}
{{comment}}
{% endmacro %}
#调用宏
{% import 'macros.html' as macros %}
{% for comment in comments %}
{{ macros.comment(comment)}}
- {% endfor %}
模板继承,使用flask-bootstrap继承Twitter Bootstrap
#user.html
{% extends "bootstrap/base.html" %}
{%block title %}Flasky{% endblock %}
{% block navbar %}
Hello, {{ name }}!
{% endblock %}
{% endblock %}
{% block content %}
from flask import Flask, render_template
from flask.ext.bootstrap import Bootstrap
app = Flask(__name__)
bootstrap = Bootstrap(app)
@app.route('/index')
def index():
return render_template('index.html')
@app.route('/usr/')
def usr(name):
return render_template('user.html', name = name)
if __name__ == '__main__':
app.run(host='0.0.0.0',port=5000,debug=True)
虽然html的那些东西看不太懂,但是总算能出个还可以看的东西。
慢慢学吧。