Flask学习笔记-程序的基本结构

使用虚拟环境

创建虚拟环境:
$ virtualenv venv
可以通过下面的命令激活这个虚拟环境:
$ source venv/bin/activate
如果使用微软 Windows 系统,激活命令是:$ venv\Scripts\activate
如果你想回到全局 Python 解释器中,可以在命令行提示符下输入 deactivate。

程序和请求上下文

Flask学习笔记-程序的基本结构_第1张图片
程序和请求上下文

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 '

Bad Request

', 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('

This document carries a cookie!

') 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/') 
def get_user(id):
    user = load_user(id) 
    if not user:
        abort(404)
    return '

Hello, %s

' % user.name

注意,abort 不会把控制权交还给调用它的函数,而是抛出异常把控制权交给 Web 服务器。

你可能感兴趣的:(Flask学习笔记-程序的基本结构)