《Flask Web开发实战》——模板
2019-11-11 本文已影响0人
北邮郭大宝
本书第三章Flask之template,对一些内容做个笔记,方便回顾。
1. 模板基本用法
- Flash默认的模板引擎是jinja2
- 借助render_template()完成渲染,传入的参数几乎可以是任何Python对象
- jinja
- 语句 {% %}
- 表达式 {{ }}
- 注释 {# #}
2. 模板辅助工具
- 上下文
- 内置上下文:config、request、session、g
- 自定义上下文:app.context_processor
- 全局对象
- 内置函数
- 自定义全局函数 app.template_global()
- 过滤器
- 内置过滤器 length、wordcount等
- 自定义过滤器 app.template_filter()
- 测试器
- 内置测试器 number、iterable
- 自定义测试器 app.template_test()
3. 模板结构组织
- 局部模板 {% include '_XX.html' %}
- 宏 {% macro % } {% endmacro %}
- 模板继承 {% extends 'base.html' %}
4. 模板进阶实践
- 加载静态文件
- flash
- 自定义错误页面 app.errorhandler()
5. code
5.1 app.py
# coding=utf-8
from flask import Flask, render_template, Markup, flash, redirect, url_for
import os
app = Flask(__name__)
app.secret_key = os.getenv('SECRET_KEY', 'SIT')
user = {
'username': 'Dabao Guo',
'bio': 'A boy who loves movies and music.',
}
movies = [
{'name': 'My Neighbor Totoro', 'year': '1988'},
{'name': 'Three Colours trilogy', 'year': '1993'},
{'name': 'Forrest Gump', 'year': '1994'},
{'name': 'Perfect Blue', 'year': '1997'},
{'name': 'The Matrix', 'year': '1999'},
{'name': 'Memento', 'year': '2000'},
{'name': 'The Bucket list', 'year': '2007'},
{'name': 'Black Swan', 'year': '2010'},
{'name': 'Gone Girl', 'year': '2014'},
{'name': 'CoCo', 'year': '2017'},
]
@app.route('/')
@app.route('/watchlist')
def watchlist():
return render_template('watchlist.html', user=user, movies=movies)
@app.route('/index')
def index():
return render_template('index.html')
# 自定义上下文
@app.context_processor
def inject_info():
foo = 'i am foo'
return dict({'foo': foo})
# 自定义全局函数
@app.template_global()
def bar():
return 'I am bar'
# 自定义过滤器
@app.template_filter()
def musical(s):
return s + Markup(' ♫')
# 自定义过滤器
@app.template_test()
def is_year(year):
if str(year) == '1994':
return True
else:
return False
# flash
@app.route("/flash")
def just_flash():
flash("你好,我是flash, 你是谁?")
return redirect(url_for('index'))
# 错误处理函数
@app.errorhandler(404)
def page_not_found(e):
return render_template("errors/404.html"), 404
5.2
- base.html
<!DOCTYPE html>
<html lang="en">
<head>
{% block head %}
<meta charset="UTF-8">
<title>{% block title %} Template - helloflask {% endblock title%}</title>
<link rel="icon" type="image/x-icon" href="{{ url_for('static', filename='favicon.ico') }}">
{% block styles %}
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css' ) }}">
{% endblock styles%}
{% endblock %}
</head>
<body>
<nav>
<ul><li><a href="{{ url_for('index')}}">Home</a></li></ul>
</nav>
<main>
{% for message in get_flashed_messages() %}
<div class="alert"> {{ message }}</div>
{% endfor %}
{% block content %} {% endblock content%}
</main>
<footer>
{% block footer %}
<small> © 2019 </small>
{% endblock footer%}
</footer>
{% block scripts %} {% endblock scripts%}
</body>
</html>
- index.html
{% extends 'base.html' %}
{% from 'macro.html' import qux %}
{% block title %} Home {% endblock title %}
{% block content %}
<h1>Template</h1>
<ul>
<li><a href= "{{ url_for('watchlist') }}">WatchList</a></li>
<li>Filter: {{ foo|musical }}</li>
<li>Global: {{ bar() }}</li>
<li>Macro: {{ qux(amount=5) }}</li>
<li><a href="{{ url_for('just_flash') }}">Flash something</a></li>
</ul>
{% endblock content %}
{% block styles %}
{{ super() }}
<style>
.b {
color: red;
}
</style>
{% endblock styles %}