使用虚拟环境
创建虚拟环境:
$ virtualenv venv
可以通过下面的命令激活这个虚拟环境:
$ source venv/bin/activate
如果使用微软 Windows 系统,激活命令是:$ venv\Scripts\activate
如果你想回到全局 Python 解释器中,可以在命令行提示符下输入 deactivate。
程序和请求上下文
Flask 在分发请求之前激活(或推送)程序和请求上下文,请求处理完成后再将其删除。程序上下文被推送后,就可以在线程中使用 current_app 和 g 变量。类似地,请求上下文被推送后,就可以使用 request 和 session 变量。如果使用这些变量时我们没有激活程序上下文或请求上下文,就会导致错误。
下面这个 Python shell 会话演示了程序上下文的使用方法:
>>> from hello import app
>>> from flask import current_app
>>> current_app.name
Traceback (most recent call last): ...
RuntimeError:working outside of application context
>>> app_ctx = app.app_context()
>>> app_ctx.push()
>>> current_app.name
'hello'
>>> app_ctx.pop()
在这个例子中,没激活程序上下文之前就调用 current_app.name 会导致错误,但推送完上下文之后就可以调用了。注意,在程序实例上调用 app.app_context() 可获得一个程序上下文。
请求钩子
有时在处理请求之前或之后执行代码会很有用。例如,在请求开始时,我们可能需要创建数据库连接或者认证发起请求的用户。为了避免在每个视图函数中都使用重复的代码,Flask 提供了注册通用函数的功能,注册的函数可在请求被分发到视图函数之前或之后调用。
请求钩子使用修饰器实现。Flask 支持以下 4 种钩子。
- before_first_request:注册一个函数,在处理第一个请求之前运行。
- before_request:注册一个函数,在每次请求之前运行。
- after_request:注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
- teardown_request:注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。
在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量 g。例如,before_request 处理程序可以从数据库中加载已登录用户,并将其保存到 g.user 中。随后调用视图函数时,视图函数再使用 g.user 获取用户。
响应
下述视图函数返回一个 400 状态码,表示请求效:
@app.route('/')
def index():
return '<h1>Bad Request</h1>', 400
视图函数返回的响应还可接受第三个参数,这是一个由首部(header)组成的字典,可以添加到 HTTP 响应中。
如果不想返回由 1 个、2 个或 3 个值组成的元组,Flask 视图函数还可以返回 Response 对象。make_response() 函数可接受 1 个、2 个或 3 个参数(和视图函数的返回值一样),并返回一个 Response 对象。有时我们需要在视图函数中进行这种转换,然后在响应对象上调用各种方法,进一步设置响应。下例创建了一个响应对象,然后设置了 cookie:
from flask import make_response
@app.route('/')
def index():
response = make_response('<h1>This document carries a cookie!</h1>') response.set_cookie('answer', '42') return response
重定向响应
from flask import redirect
@app.route('/')
def index():
return redirect('http://www.example.com')
错误处理响应
abort函数
例如:
from flask import abort
@app.route('/user/<id>')
def get_user(id):
user = load_user(id)
if not user:
abort(404)
return '<h1>Hello, %s</h1>' % user.name
注意,abort 不会把控制权交还给调用它的函数,而是抛出异常把控制权交给 Web 服务器。