我们已经知道,路由函数的返回值会作为HTTP响应信息返回给客户端。不过如果要对HTTP响应信息做更复杂的操作,如设置HTTP响应头,就需要获得HTTP响应对象,也就是Response对象。
获取Response对象需要导入flask模块的make_response函数,该函数用于返回一个flask.wrappers.Response对象,然后路由函数直接返回这个Response对象即可。
Response对象有很多常用的场景,例如,可以通过Response对象向客户端写入Cookie。相信编写过Web应用的读者应该对Cookie很了解。Cookie其实就是服务端向客户端浏览器写入的一段文本信息(最大是4KB),那么服务端是怎么通知客户端要写入什么的?其实就是通过HTTP响应头向客户端浏览器发送要写入的Cookie信息。也就是说,在服务端写入Cookie的操作就是设置HTTP响应头,这就要用到Response对象中的set_cookie方法。该方法需要传入3个参数。第1个参数是Cookie的key,第2个参数是Cookie的值,第3个参数是Cookie的过期时间。
# 向客户端写入Cookie,有效期是20秒。20秒后,Cookie自动失效
response.set_cookie('name', 'lining' ,max_age=20);
Cookie的主要目的是用于跟踪客户端浏览器的。当某个浏览器访问了服务端,服务端就会向客户端浏览器写1个或多个Cookie。当该浏览器再次访问服务端时,服务端就会知道这个浏览器曾经访问过服务端。那么这是如何做到的呢?这就涉及到浏览器读取Cookie,并将其通过HTTP请求发送给服务端的过程。浏览器读取Cookie是自动的,不需要我们干涉。但对于服务端程序来说,需要读取从客户端浏览器发过来的Cookie,这就要使用到前面介绍的request变量。
# 从客户端读取名为name的Cookie的值,并将读取结果赋给value变量
value = request.cookies.get('name');
本例通过根路由获取了Response对象,并返回了这个Response对象。然后通过writeCookie路由函数向客户端写了一个Cookie,最后通过readCookie路由函数从HTTP请求中读取了这个Cookie。
from flask import Flask
from flask import request
from flask import make_response
app = Flask(__name__)
# 用于获取并返回Response对象的根路由
@app.route('/')
def index():
response = make_response('<h1>This document is response text</h1>')
return response
# 向客户端写入Cookie的动态路由
@app.route('/writecookie/<cv>')
def writeCookie(cv):
response = make_response('<h1>Cookie已经写入</h1>')
# 向客户端写Cookie,有效期是20秒
response.set_cookie('cv', cv,max_age=20);
return response
# 从HTTP请求读取Cookie的路由
@app.route('/readcookie')
def readCookie():
value = request.cookies.get('cv');
print(value)
# 如果Cookie过期,输出“Cookie失效”
if value == None:
value = 'Cookie失效';
return value
if __name__ == '__main__':
app.run()
运行程序,然后在浏览器地址栏中输入下面的地址,会得到如图1所示的输出内容。
图1 路由函数返回Response对象
接下来在浏览器地址栏中输入下面的地址,将值为hello的Cookie写入客户端,会在浏览器中输出如图2所示的内容。
图2 写入Cookie
最后在浏览器地址栏中输入下面的地址来读取Cookie,会在浏览器中输出如图3所示的内容。
图3 读取Cookie
由于Cookie的有效期是20秒,所以等待20秒后,再刷新页面,会看到在浏览器上输出如图4所示的信息。
图4 Cookie失效
- EOF -