前面几篇,我们了解了一些基础的请求响应以及相关的一些知识,基本已经走完了一个最简单的hello world结构。
那么,今天我们就从整体出发,在浅谈几点补充知识。
1.flask 上下文
2.flask 请求钩子
3.flask 状态码响应
4.flask 扩展
flask从客户端接收请求时候,要让视图函数访问一些对象获取一定的参数,这样才能处理请求。请求对象就是一个很实际的例子,它封装了客户端发送的http请求的内容。
如果,请求对象是一次请求的单一变量,那么这样就要在每个视图函数的参数项中添加一个参数,繁杂不说,而且难以维护。
为了应对这种情况,flask提供了上下文机制,将一些变量设置为全局变量,一次来解决这类需求。
但是,请求对象request必然不能多用户通用,只能一次请求中所有的操作可以通用全局访问,这说明,全局变量有线程内和跨线程的。下面是具体分类和功能:
变量名称
上下文
作用说明
current_app
程序上下文
当前已激活程序的实例属性名称
g
处理请求时,用作临时存储的对象。每次请求都会重设这个变量。
request
请求上下文
请求对象,封装了客户端http请求的所有内容。
session
用户会话,用于存储请求之间需要记住的值的字典。
注:在使用current_app之前,需要激活上下文。通过app.app_context()来获得一个程序上的上下文。
具体命令:
app_ctx = app.app_context()
app_ctx.push()
我们都知道,在一般程序的启动开始,必然有针对程序运行环境的配置检查等一系列只在开始进行却不会重复或者需要在每次关闭程序时候执行的环境清理的一些内部操作。
那么flask是怎么实现此类功能的呢?这里就需要我们引入flask钩子的概念。以此来注册通用函数,被注册的函数可以在被分发到视图函数之前或者之后执行。
请求钩子通过修饰器来实现。flask主要支持以下四种钩子:
钩子
作用
before_first_request
注册一个函数,在处理第一个请求之前运行。
before_request
注册一个函数,在每次执行请求之前运行。
after_request
注册一个函数,如果没有未处理的异常抛出,在每次请求执行后运行。
teardown_request
注册一个函数,即使有异常抛出,也在每次请求执行后运行。
注:在请求钩子注册的函数和视图函数之间,共享的数据一般保存在上文提到的程序上下文变量g中。
我们都知道,在请求响应中,如果响应码为200就是成功响应,404就是找不到页面,以及其他的一些代码都有对应的含义。
那么我们在后台处理完请求之后,怎么讲制定的状态码返回呢?之前的示例中为什么没有见到有返回状态码的例子呢?
那么我们现在就来讲解,如果想要在处理的请求响应中返回指定的状态码,可以通过以下几种方式:
第一种:元组值响应
@app.route('/user/',methods=[get,post])def users():return hello , user .,200
这一种最直接,在返回值元组后面加上状态码,以逗号分隔就好。
第二种:response响应
@app.route('/user/',methods=[get,post])def users():response = make_response(hello , user .)response.set_cookie(answer,200)return response
通过make_response()函数来构建响应,在cookie中添加字典值。
系列伊始,我们就介绍了,flask是一个微框架,只保留了最核心的功能,其他的功能需要根据实际需求和喜好,去安装对应的扩展插件。
此处以flask-script为例:
首先使用pip安装:
pip install flask-script
其次在程序开始导入flask-script中的manager模块:
from flask_script import manager
生成manager的app处理实例:
manager = manager(app)
最终,在末尾的程序运行处,以实例manager进行运行程序:
if __name__ == '__main__':manager.run()
此时代码完成后,已经不能再ide中通过运行键来运行项目,需要在cmd中切换到项目目录,运行如下命令:
python project.py runserver --host 0.0.0.0
最终,你会看到程序运行的提示反馈。此时的project可以通过其他机器访问本机ip来进行访问项目。
牛牛牛