API
这部分文档涵盖了 Flask 的所有接口。对于那些 Flask 依赖外部库的部分,我们这里提供了最重要的部分的文档,并且提供其官方文档的链接。
应用对象
蓝图对象
进入的请求对象
class flask.request
会话
如果你设置了 Flask.secret_key ,你可以在 Flask 应用中使用会话。会话主要使得在请求见保留信息成为可能。 Flask 的实现方法是使用一个签名的 cookie 。这样,用户可以查看会话的内容,但是不能修改它,除非用户知道密钥。所以确保密钥被设置为一个复杂且无法被容易猜测的值。
你可以使用 session 对象来访问当前的会话:
class flask.session 0.8 新版功能
会话接口提供了简单的途径来替换 Flask 正在使用的会话实现。
Notice
PERMANENT_SESSION_LIFETIME 配置键从 Flask 0.8 开始可以是一个整数。你可以自己计算值,或用应用上的permanent_session_lifetime 属性来自动转换结果为一个整数。
测试客户端
应用全局变量
只在一个请求内,从一个函数到另一个函数共享数据,全局变量并不够好。因为这在线程环境下行不通。 Flask 提供了一个特殊的对象来确保只在活动的请求中有效,并且每个请求都返回不同的值。一言蔽之:它做正确的事情,如同它对 request 和 session 做的那样。
flask.g flask.current_app
JSON 支持
Flask 使用 simplejson 来实现JSON。自从 simplejson 既在标准库中提供也在 Flask 的拓展中提供。Flask将首先尝试自带的simplejson,如果失败了就使用标准库中的json模块。除此之外,为了更容易定制它还会委托访问当前应用的JSON的编码器和解码器。
所以首先不要这样用:
try: import simplejson as json except ImportError: import json
你可以这样
from flask import json
For usage examples, read the json documentation.
关于更多的用法,请阅读标准库中的 json 文档。下面的拓展已经默认被集成到了标准库中JSON模块里:
- datetime 对象被序列化为 RFC 822 字符串。
- 任何带有 __html__ 方法(比如 Markup)将在序列化的时候
调用这个方法然后返回的字符串将会被序列化为字符串。
这个 htmlsafe_dumps() 方法也能在 Jinja2 的过滤器中使用,名字为|tojson 。请注意在 script 标签内部的内容将不会被转义,所以如果你想在script 内部使用的话请确保它是不可用的通过 |safe 来转义,除非你正在使用 Flask 0.10,如下:
<script type=text/javascript>
doSomethingWith({{ user.username|tojson|safe }});
</script>
模板渲染
配置
扩展
flask.ext
有用的内构件
flask._request_ctx_stack 0.6 新版功能.
flask.signals_available 0.7 新版功能.
URL 路由注册
在路由系统中定义规则可以的方法可以概括为三种:
- 使用 flask.Flask.route() 装饰器
- 使用 flask.Flask.add_url_rule() 函数
- 直接访问暴露为 flask.Flask.url_map 的底层的 Werkzeug 路由系统
路由中的变量部分可以用尖括号指定( /user/<username>)。默认情况下,URL 中的变量部分接受任何不带斜线的字符串,而 <converter:name> 也可以指定不同的转换器。
变量部分以关键字参数传递给视图函数。
下面的转换器是可用的:
string | 接受任何不带斜线的字符串(默认的转换器) |
int | 接受整数 |
float | 同 int ,但是接受浮点数 |
path | 和默认的相似,但也接受斜线 |
这里是一些例子:
@app.route('/')
def index():
pass
@app.route('/<username>')
def show_user(username):
pass
@app.route('/post/<int:post_id>')
def show_post(post_id):
pass
需要注意的一个重要细节是 Flask 处理结尾斜线的方式。你可以应用下面两个规则来保证 URL 的唯一:
- 如果规则以斜线结尾,当用户以不带斜线的形式请求,用户被自动重定向到带有结尾斜线的相同页面。
- 如果规则结尾没有斜线,当用户以带斜线的形式请求,会抛出一个 404 notfound 。
这与 web 服务器处理静态文件的方式一致。这使得安全地使用相对链接地址成为可能。
你可以为同一个函数定义多个规则。无论如何,他们也要唯一。也可以给定默认值。这里给出一个接受可选页面的 URL 定义:
@app.route('/users/', defaults={'page': 1})
@app.route('/users/page/<int:page>')
def show_users(page):
pass
这指定了 /users/ 为第一页的 URL ,/users/page/N 为第 N 页的 URL 。
以下是 route() 和 add_url_rule()接受的参数。两者唯一的区别是,带有路由参数的视图函数用装饰器定义,而不是view_func 参数。
rule | URL 规则的字符串 |
endpoint | 注册的 URL 规则的末端。如果没有显式地规定,Flask 本身假设 末端的名称是视图函数的名称,。 |
view_func | 当请求呈递到给定的末端时调用的函数。如果没有提供,可以 在用在 view_functions 字典中以末端 作为键名存储,来在之后设定函数。 |
defaults | 规则默认值的字典。上面的示例介绍了默认值如何工作。 |
subdomain | 当使用子域名匹配的时候,为子域名设定规则。如果没有给定,假 定为默认的子域名。 |
**options | 这些选项会被推送给底层的 Rule 对象。一个 Werkzeug 的变化是 method 选项的处理。methods是 这个规则被限定的方法列表( GET , POST 等等)。默认情 况下,规则只监听 GET (也隐式地监听 HEAD )。从 Flask 0.6 开始,OPTIONS 也被隐式地加入,并且做标准的请求处理。 它们需要作为关键字参数来给定。 |
视图函数选项
对内部使用,视图函数可以有一些属性,附加到视图函数通常没有控制权的自定义的行为。下面的可选属性覆盖 add_url_rule() 的默认值或一般行为:
- __name__: 函数的名称默认用于末端。如果显式地提供末端,这个值会使用。此外,它默认以蓝图的名称作为前缀,并且不能从函数本身自定义。
- methods: 如果没有在添加 URL 规则时提供 methods 参数。 Flask 会在视图函数对象上寻找是否存在 methods 属性。如果存在,它会从上面拉取方法的信息。
- provide_automatic_options: 如果设置了这个属性, Flask 会强制禁用或启用 HTTP OPTIONS 响应的自动实现。这对于对单个视图自定义 OPTIONS响应而使用装饰器的情况下是有用的。
- required_methods: 如果这个属性被设置了, 当注册一个 URL 规则的时候,Flask 将总是会添加这些 methods 即使 methods 参数在 route() 调用的时候被显式的覆盖了。
完整的例子:
def index():
if request.method == 'OPTIONS':
# custom options handling here
...
return 'Hello World!'
index.provide_automatic_options = False
index.methods = ['GET', 'OPTIONS']
app.add_url_rule('/', index)
0.8 新版功能:加入了 provide_automatic_options 功能。