【Flask】Flask Cookie操作
### 什么是cookie:
在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。
cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,
当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。
cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。
1. cookie有有效期:服务器可以设置cookie的有效期,以后浏览器会自动的清除过期的cookie。
2. cookie有域名的概念:只有访问同一个域名,才会把之前相同域名返回的cookie携带给服务器。也就是说,访问谷歌的时候,不会把百度的cookie发送给谷歌。
### flask操作cookie:
1. 设置cookie:设置cookie是应该在Response的对象上设置。`flask.Response`对象有一个`set_cookie`方法,可以通过这个方法来设置`cookie`信息。
在Chrome浏览器中查看cookie的方式:
* 右键->检查->Network->重新加载页面->找到请求,然后查看Response Headers中的cookie
* 点击url输入框左边的信息icon,然后找到相应的域名,再展开查看cookie。
* 在Chrome的设置界面->高级设置->内容设置->所有cookie->找到当前域名下的cookie。
2. 删除cookie:通过`Response.delete_cookie`,指定cookie的key,就可以删除cookie了。
###Flask 设置/删除 cookie
1 from flask import Flask, request, Response 2 3 app = Flask(__name__) 4 5 6 @app.route('/') 7 def hello_world(): 8 resp = Response("saber's home") 9 resp.set_cookie('username', 'saber') 10 return resp 11 12 13 @app.route('/del/') 14 def delete_cookie(): 15 resp = Response("Saber's home 2") 16 resp.delete_cookie('username') 17 return resp 18 19 if __name__ == '__main__': 20 app.run(debug=True)
######. 设置cookie的有效期:
* max_age:以秒为单位,距离现在多少秒后cookie会过期。
* expires:为datetime类型。这个时间需要设置为格林尼治时间,也就是要距离北京少8个小时的时间。
* 如果max_age和expires都设置了,那么这时候以max_age为标准。
* max_age在IE8以下的浏览器是不支持的。expires虽然在新版的HTTP协议中是被废弃了,但是到目前为止,所有的浏览器都还是能够支持,所以如果想要兼容IE8以下的浏览器,那么应该使用expires,否则可以使用max_age。
* 默认的过期时间:如果没有显示的指定过期时间,那么这个cookie将会在浏览器关闭后过期。
1 from flask import Flask, request, Response 2 from datetime import datetime, timedelta 3 4 app = Flask(__name__) 5 6 7 @app.route('/') 8 def hello_world(): 9 resp = Response("saber's home") 10 # resp.set_cookie('username', 'saber', max_age=60) 11 # resp.set_cookie('username', 'saber', expires=datetime(2018, 4, 19, 14, 0, 0)) 12 expires = datetime.now() + timedelta(days=30, hours=16) 13 resp.set_cookie('username', 'saber', expires=expires) 14 return resp 15 16 if __name__ == '__main__': 17 app.run(debug=True)
#### 设置cookie有效域名
cookie默认是只能在主域名下使用。如果想要在子域名下使用,那么应该给`set_cookie`传递一个`domain='.hy.com'`,这样其他子域名才能访问到这个cookie信息。
1 from flask import Flask, request, Response 2 from datetime import datetime, timedelta 3 from cmsviews import bp 4 5 app = Flask(__name__) 6 app.register_blueprint(bp) 7 app.config['SERVER_NAME'] = 'hy.com:5000' 8 9 10 @app.route('/') 11 def hello_world(): 12 resp = Response("saber's home") 13 # resp.set_cookie('username', 'saber', max_age=60) 14 # resp.set_cookie('username', 'saber', expires=datetime(2018, 4, 19, 14, 0, 0)) 15 resp.set_cookie('username', 'saber', domain='.hy.com') 16 return resp 17 18 if __name__ == '__main__': 19 app.run(debug=True)