了解flask与http协议的交互方式,即了解flask处理请求和响应的各种方式。

2.1 请求响应循环


当用户访问一个URL,浏览器便生成对应的HTTP请求,经由互联网发送到对应的Web服务器。Web服务器接收请求,通过WSGI将HTTP格式的请求数据转换成我们的Flask程序能够使用的Python数据。在程序中,Flask根据请求的URL执行对应的视图函数,获取返回值生成响应。响应依次经过WSGI转换生成HTTP响应,再经由Web服务器传递,最终被发出请求的客户端接收。浏览器渲染响应中包含的HTML和CSS代码,并执行Java Script代码,最终把解析后的页面呈现在用户浏览器的窗口中。

2.2 http请求

对于http请求可以分为请求和响应两类,请求和响应分别有不同的报文首部和报文主体。
flask的请求对象封装了从客户端发来的请求报文,我们可以通过请求对象获取请求报文中的所有数据。
请求的解析和响应的封装都是通过werkzeug模块完成的,flask子类化werkzeug的请求和响应对象,并且添加了和程序相关的特定功能。
request对象的属性和方法如下:

Werkzeug的Mutli Dict类是字典的子类,它主要实现了同一个键对应多个值的情况。Immutable Multi Dict类继承了MutliDict类,但其值不可更改。
当我们从request对象的类型为Mutli Dict或Immutable Multi Dict的属性(比如files、form、args)中直接使用键作为索引获取数据时(比如request.args[’name’]),如果没有对应的键,那么会返回HTTP 400错误响应。

from flask import Flask,request
app=Flask(__name__)
@app.route("/hello")
def hello():
    name=request.args.get('name','flask')   #name为接收的值的参数,flask为默认的参数值
    return "hello %s" %name

2.2.3 flask中处理请求

在flask中url请求是需要匹配对应的视图函数的,视图函数的返回值作为响应的一部分内容。
1. 路由匹配
程序实例中存储了一个路由表(app.url_map),其中定义了url和视图函数的映射关系。若是没有匹配到对应的视图函数会自动返回404相应页面。

flask routes    //查看当前程序实例中定义的所有路由
  1. 设置监听的http方法
    http请求中常用的有get和post方法,那么该如何设置监听固定http方法呢。
    可以在app.route()修饰器中使用methods参数传入一个包含监听的http方法的可迭代对象。
@app.route('/hello',methods=['GET','POST'])
def hello():
    return '123'

请求方法不符合设定的时候会产生一个405响应,即请求方法不允许。
3. url处理
之前提到了,/hello/<name>中的name参数就像是函数的形参,用来接收请求中传入的对应的值,那么这里的name参数有没有类型限制呢?这就要提起转换器了,实际上我们可以通过<int:name>来将name值转换为整数的值,那么我们就可以利用name参数来进行数学计算了。但是如果传入的不是一个数字的话,就会产生一个value error的错误。

string  不包含斜线的字符串(默认值)
int     整型
float   浮点数
path    包含斜线的字符串,静态路由的url规则中的filename变量就是用了这个转换器
any     匹配一系列给定值中的一个元素
uuid    uuid字符串

2.2.4 请求钩子

如果我们要对一些请求进行预处理或者是后处理,可能就需要使用flask提供的一些请求钩子。比如说你要进行加法运算,首先在进行运算之前要判断是否每个数据都是符合规则的,而在运算结束后你可能会需要判断结果是不是规则的。他们可以用来注册在请求处理的不同阶段执行的处理函数,或者称为回调函数。这些请求钩子使用起来和装饰器基本相同。

每个钩子可以注册任意多个函数,函数名并不是必须和钩子名相同。

@app.before_request
def do_something():
    pass    #需要执行的代码

假如我们创建了三个视图函数A、B、C,其中视图C使用了after_this_request钩子,那么当请求A进入后,整个请求处理周期的请求处理函数调用流程如图:

after_request钩子和after_this_request钩子必须接收一个响应类对象作为参数,并且返回同一个或更新后的响应对象。

说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...