1.创建Python的虚拟环境
cd /home/ubuntu # 定位到需要放置虚拟环境的目录
virtualenv venv # venv为虚拟环境目录名
source venv/bin/activate # 激活虚拟环境
当虚拟环境中的工作完成后,如果想回到全局Python 解释器中,可以在命令行提示符下输入deactivate。
2.程序初始化
所有Flask 程序都必须创建一个程序实例。Web 服务器网关接口(WSGI)把接收自客户端的所有请求都转交给这
个对象处理。程序实例是Flask 类的对象,经常使用下述代码创建:
from flask import Flask
app = Flask(__name__)
Flask 类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。在大多数程序中,Python 的 __name__ 变量就是所需的值。
将构造函数的name 参数传给Flask 程序,Flask 用这个参数决定程序的根目录,以便稍后能够找到相对于程序根目录的资源文件位置。
3.路由和视图函数
客户端把请求发送给Web 服务器,Web 服务器再把请求发送给Flask程序实例。程序实例需要知道对每个URL 请求运行哪些代码,所以保存了一个URL 到Python 函数的映射关系。处理URL 和函数之间关系的程序称为路由。
在Flask 程序中定义路由的最简便方式,是使用程序实例提供的app.route 修饰器,把修饰的函数注册为路由
@app.route('/')
def index(): # 把index() 函数注册为程序根地址的处理程序
return '<h1>Hello World!</h1>'
像index() 这样的函数称为视图函数(view function)。视图函数返回的响应可以是包含HTML 的简单字符串,也可以是复杂的表单
视图函数的作用很明确,即生成请求的响应
4.启动服务器
程序实例用run 方法启动Flask 集成的开发Web 服务器:
if __name__ == '__main__':
app.run(debug=True)
__name__==’__main__’ 是Python 的惯常用法,在这里确保直接执行这个脚本时才启动开发Web 服务器。如果这个脚本由其他脚本引入,程序假定父级脚本会启动不同的服务器,因此不会执行app.run()。
服务器启动后,会进入轮询,等待并处理请求。轮询会一直运行,直到程序停止,比如按Ctrl-C 键。
Flask 提供的Web 服务器不适合在生产环境中使用
5.Flask上下文全局变量
变量名 | 上下文 | 说明 |
---|---|---|
current_app | 程序上下文 | 当前激活程序的程序实例 |
g | 程序上下文 | 处理请求时用作临时存储的对象。每次请求都会重设这个变量 |
request | 请求上下文 | 请求对象,封装了客户端发出的HTTP 请求中的内容 |
session | 请求上下文 | 用户会话,用于存储请求之间需要“记住”的值的词典 |
Flask 在分发请求之前激活(或推送)程序和请求上下文,请求处理完成后再将其删除。
程序上下文被推送后,就可以在线程中使用current_app 和g 变量。类似地,请求上下文被推送后,就可以使用request 和session 变量。
如果使用这些变量时我们没有激活程序上下文或请求上下文,就会导致错误。
6.请求钩子
为了避免在每个视图函数中都使用重复的代码,Flask 提供了注册通用函数的功能,注册的函数可在请求被分发到视图函数之前或之后调用。例如,在请求开始时,我们可能需要创建数据库连接或者认证发起请求的用户。
请求钩子使用修饰器实现。Flask 支持以下4 种钩子。
• before_first_request:注册一个函数,在处理第一个请求之前运行。
• before_request:注册一个函数,在每次请求之前运行。
• after_request:注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
• teardown_request:注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。
在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g。例如,before_request 处理程序可以从数据库中加载已登录用户,并将其保存到g.user 中。随后调用视图函数时,视图函数再使用g.user 获取用户。