- HTTP (超文本传输协议)定义了服务器和客户端之间信息交流的格式和传递方式,他是万维网(WWW)中数据交互的基础
- 一个Flask程序工作的实际流程:
HTTP是客户端与服务器的连接方式,WSGI是服务器接受数据与Flask的链接方式。
在程序中,Flask根据请求的URL执行对应的试图函数,获取返回值生成相应。相应一次经过WSGI转换成HTTP相应,再经由Web服务器传递,最终被发出请求的客户端接收。
-
HTTP请求:以 http://helloflask.com/hello?name=Grey 为例:
-
请求报文:
请求的实质是发送到服务器上的一些数据,这种浏览器与服务器之间交互的数据被称为报文,请求时浏览器发送的数据被称为请求报文,而服务器返回的数据被称为响应报文。
请求的报文由请求的方法、URL、协议版本、首部字段以及内容实体组成。HTTP通过请求方法区别不同的请求类型:
-
request对象:当Flask接收到请求后,请求对象会提供多个属性来获取URL的各个部分:
除了url,请求报文中的其他信息都可以通过request对象提供的属性和方法获取:
ps:和普通的字典类型不同,当从request对象的类型为MutliDict或Immutable Multi Dict的属性(比如request.args[‘name’]),如果没有对应的键,会返回HTTP 400错误响应,而不是抛出KEY ERROR。为了避免这个错误,我们应该使用get()获取数据,如果没有对应的值,会返回None;get()方法的第二个参数可以设置默认值。
-
路由匹配
>url是指向网络上资源的地址,在Flask中,我们需要让请求的URL匹配对应的视图函数,返回值就是URL对应的资源。app.url_map:路由表,定义了URL规则和视图函数的映射关系。Flaks会根据请求报文中的URL规则进行匹配,如果匹配不成功,会自动返回404错误响应。 使用flask routes命令可以查看程序中定义的所有路由:
endpoint 每个路由对应的端点;Methods 方法;Rule url规则
static端点是Flask添加的特殊路由,用来采访静态文件
-
设置监听的HTTP方法
可以在app.route()中使用methods参数传入一个包含监听的HTTP方法的可迭代对象。
当某个请求的方法不符合要求时,将无法正常处理。如,在表单提交时通常使用post,而提交的目标URL对应的视图函数只允许用GET,Flask会自动返回一个405(请求方法不允许)的错误响应。 -
url处理
输入http://localhost:5000/goback/34:
在url中添加一个数字作为时光倒流的年数。
< int:year>表示为year变量添加一个int转换器,Flask会解析这个变量将其转换为整型。
<转换器:变量名>,若不使用转换器,year会默认转换为字符串,若输入的是英文字母,会抛出value error异常,需要自动验证,转换后,如果url中传入的变量不是数字,直接返回404.
any转换器:在后面添加括号来给出可选值
如果想在any转换器中传入一个预先定义的列表,可用格式化字符串的方法(使用%或是format()函数)来构建url规则字符串:colors = ['blue', 'white', 'red'] @app.route('/colors/<any(%s):color>' % str(colors)[1:-1])
-
请求钩子:用来注册在请求处理的不同阶段执行的处理函数,或称为回调函数,即callback。
每个钩子可以注册任意多个处理函数,函数名并不是必须和钩子名称相同:
假如创建三个视图函数A B C,其中视图C使用了after_this_request钩子,那么当请求A进入后,整个请求处理周期的请求处理函数调用流程:
请求钩子常用应用场景: -
before_this_request:在玩具程序中,运行程序前需要进行一些初始化操作,比如创建数据库,添加管理员用户
-
before_request:网站上要记录用户最后在线的时间,可以通过用户最后发送的请求时间来实现。为了避免在每个视图函数都添加更新在线时间的代码,可使用这个钩子
-
after_request:在视图函数中进行数据库操作,如更新、插入等,之后需要更新提交到数据库中
-
teardown_request:对于多个视图函数需要建立和关闭数据库连接,理想的方法是在请求之前(before_request)建立连接,在请求之后(teardown_request)关闭连接。