静态文件
动态的 web 应用也需要静态文件,一般是 CSS
和 JavaScript
文件。理想情况下你的 服务器已经配置好了为你的提供静态文件的服务。但是在开发过程中, Flask 也能做好这项工作。只要在你的包或模块旁边创建一个名为 static
的文件夹就行了。 静态文件位于应用的 /static
中。
url_for('static', filename='style.css')
这个静态文件在文件系统中的位置应该是 static/style.css
渲染模板
在 Python 内部生成 HTML 不好玩,且相当笨拙。因为你必须自己负责 HTML 转义, 以确保应用的安全。因此, Flask 自动为你配置Jinja2 模板引擎。
使用 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)
Flask 会在 templates
文件夹内寻找模板。因此,如果你的应用是一个模块, 那么模板文件夹应该在模块同级目录;如果是一个包,那么就应该在包里面。
情形 1 : 一个模块:
/application.py
/templates
/hello.html
情形 2 : 一个包:
/application
/__init__.py
/templates
/hello.html
Jinja2 模板示例:
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
在模板内部可以和访问 get_flashed_messages()
函数一样访问 request
、 session
和 g
对象。
模板在继承使用的情况下尤其有用。其工作原理参见 模板继承
方案文档。简单的说,模板继承可以使每个页面的特定元素(如页头、导航和页尾) 保持一致。
基础模板
这个模板的名称是 :file:layout.html
,它定义了一个简单的 HTML 骨架,用 于显示一个简单的两栏页面。“子”模板的任务是用内容填充空的块:
<!doctype html>
<html>
<head>
{% block head %}
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
<title>{% block title %}{% endblock %} - My Webpage</title>
{% endblock %}
</head>
<body>
<div id="content">{% block content %}{% endblock %}</div>
<div id="footer">
{% block footer %}
© Copyright 2010 by <a href="http://domain.invalid/">you</a>.
{% endblock %}
</div>
</body>
</html>
在这个例子中, {% block %}
标记定义了四个可以被子模板填充的块。 block 标记告诉模板引擎这是一个可以被子模板重载的部分
子模板
{% extends "layout.html" %}
{% block title %}Index{% endblock %}
{% block head %}
{{ super() }}
<style type="text/css">
.important { color: #336699; }
</style>
{% endblock %}
{% block content %}
<h1>Index</h1>
<p class="important">
Welcome on my awesome homepage.
{% endblock %}
这里 {% extends %}
标记是关键,它告诉模板引擎这个模板“扩展”了另一个模板, 当模板系统评估这个模板时会先找到父模板。这个扩展标记必须是模板中的第一个标记。 如果要使用父模板中的块内容,请使用 {{ super() }}
自动转义默认开启。因此,如果 name 包含 HTML ,那么会被自动转义。如果你可以 信任某个变量,且知道它是安全的 HTML,那么可以使用 Markup
类把它标记为安全的,或者在模板 中使用 | safe
过滤器。
下面 Markup 类的基本使用方法:
>>> from flask import Markup
>>> Markup('<strong>Hello Flask!</strong>')'
Markup(u'<strong>Hello Flask!</strong>')
>>> Markup.escape('<blink>hacker</blink>')
Markup(u'<blink>hacker</blink>')