Flask1 - QLGQ/learning-python GitHub Wiki
在Flask框架中,可以利用Jinja2的模板继承的特点,把所有模板公共的部分移除出页面的布局,接着把它们放在一个基础模板中,所有使用它的模板可以导入该基础模板。
实例如下:
我们定义一个基础模板,该模板包含导航栏以及上面谈论的标题。(文件app/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(文件app/templates/index.html):
{% extends "base.html" %}
{% block content %}
<h1>Hi, {{user.nickname}}!</h1>
{% for post in posts %}
<div><p>{{post.author.nickname}} says: <b>{{post.body}}</b></p></div>
{% endfor %}
{% endblock %}
Flask中使用render_template()方法来渲染模板,你需要做的就是将模板名和你想作为关键字的参数传入模板的变量。
from flask import render_template
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
- url_for():给指定的函数构造url,它接受函数名作为第一个参数,也接受对应url规则的变量部分的命名参数,未知变量部分会添加到URL末尾作为查询参数。
- make_response():在视图里操纵响应对象。
@app.errorhandler(404)
def not_found(error):
return render_template('error.html'), 404
@app.errorhandler(404)
def not_found(error):
resp = make_response(render_template('error.html'), 404)
resp.headers['X-Something'] = 'A value'
return resp
视图函数的返回值会被自动转换为一个响应对象。如果返回值是一个字符串,它被转换为该字符串为主体的、状态码为200 OK的、MIME类型是text/html的响应对象。Flask把返回值转换为响应对象的逻辑是这样的:
- 如果返回的是一个合法的响应对象,它会从视图直接返回。
- 如果返回的是一个字符串,响应对象会用字符串数据和默认参数创建。
- 如果返回的是一个元组,且元组中的元素可以提供额外的信息。这样的元组必须是(response, status, headers) 的形式,且至少包含一个元素。 status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值。
- 如果上述条件均不满足, Flask 会假设返回值是一个合法的 WSGI 应用程序,并转换为一个请求对象。