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把返回值转换为响应对象的逻辑是这样的:

  1. 如果返回的是一个合法的响应对象,它会从视图直接返回。
  2. 如果返回的是一个字符串,响应对象会用字符串数据和默认参数创建。
  3. 如果返回的是一个元组,且元组中的元素可以提供额外的信息。这样的元组必须是(response, status, headers) 的形式,且至少包含一个元素。 status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值。
  4. 如果上述条件均不满足, Flask 会假设返回值是一个合法的 WSGI 应用程序,并转换为一个请求对象。
⚠️ **GitHub.com Fallback** ⚠️