前面我们已经练习了一个最简单的Flask程序,下面我们更加深入了解一下Flask的工作方式
请求上下文
Flask 从客户端收到请求时,要让视图函数能访问一些对象,这样才能处理请求。
要让视图函数能够访问请求对象,一个显而易见的方法就是将其作为参数传入视图函数不过这样会导致程序中每个视图函数都增加一个参数
为了避免大量可有可无的参数,Flask使用上下文临时吧某些对象变为全局可访问。有了上下文,就可以写出下了视图函数:
在这段视图函数我们把request当作全局变量来使用。事实上,request不可能是全局变量。在多线程服务器中,多个线程同时处理不同客户端发送的不同请求时,每个线程看到的request必然是不相同的。Flask使用上下文让特定的变量在一个线程中全局可访问,与此同时不干扰其他线程。
Flask上下文全局变量
| 变量名 | 上下文 | 说明 |
| ---------- | — | —|
| current_app | 程序上下文 |当前激活程序的程序实例|
| g | 程序上下文 | 处理请求时用作临时存储数据的对象,每次请求都会重设这个变量|
| request| 请求上下文 | 请求对象,封装了客户端发出的HTTP请求中的内容|
| session | 请求上下文 | 用户会话,用于存储请求之间需“记住”的值的词典 |
Flask在分发请求之前激活或推送程序和请求上下文,请求处理完成后再将其删除。程序上下文被推送后,就可以在线程中使用current_app和g变量,类似的,请求上下文被推送后,就可以使用request和session变量,如果使用这些变量前我们没有激活程序上下文或请求上下文,就会导致错误。如果你不知道为什么这4个上下文变量如此有用,那么不用担心,一步一步,带着疑问,我们一起揭开Flask的神秘面纱。
Flask中的请求调度
程序收到客户端的请求时要找到处理该请求的视图函数,为了完成这个任务,Flask会在程序的URL映射中查找请求URL。URL映射是URL和视图函数之间的对应关系。Flask使用app.route修饰器或者非修饰器形式的app.add_url_rule()生成映射。
Flask中的请求钩子
有时在处理请求之前或者之后执行代码很有用。我们可能需要创建数据库连接或者认证发起请求的用户。为了避免在每个视图函数中都是重复的代码,Flask提供了注册通用函数的功能,注册的函数可在请求被分发到视图函数之前或者之后调用。
请求钩子使用修饰器实现,Flask中有4中钩子
before_frist_request:注册一个函数,在处理第一个请求之前运行。
before_request:注册一个函数,在每次请求之前运行
after_request:注册一个函数,如果没有处理的异常抛出,在每次请求之后运行
teardown_request:注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行
在请求钩子函数和视图函数之间共享数据一般使用上下文全局对象g。例如,before_request处理程序可以从数据库加载已经登陆的用户,并将其保存到g.user中随后调用视图函数时在使用g.user获取用户。
Flask中的响应
Flask调用视图函数后,会将其返回值作为响应内容。Http响应中一个很重要的部分是状态码Flask默认为200.这个代码代表请求已经成功被处理。
领取专属 10元无门槛券
私享最新 技术干货