Flask 学习之cookie和session操作
***1.cookie 和session ***
**cookie 概述**
```
cookie:在网站中, http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功
后,第二次请求服务器依然不能知道当前请求是哪个用户。 cookie 的出现就是为了解决这个
问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该
用户发送第二次请求的时候,就会自动的把上次请求存储的 cookie 数据自动的携带给服务
器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。 cookie 存储的数据量有限,
不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用 cookie 只能存储一些小量的
数据
1.Cookie 有有效期: 服务器可以设置cookie有效期,以后浏览器会清除cookie信息
2.Cookie 和域名有关系概念;
```
**sesson概述**
```
session: session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的
是, cookie 是存储在本地浏览器, session 是一个思路、一个概念、一个服务器存储授权信
息的解决方案,不同的服务器,不同的框架,不同的语言有不同的实现。虽然实现不一样,但
是他们的目的都是服务器为了方便存储数据的。 session 的出现,是为了解决 cookie 存储数
据不安全的问题的
```
**cookie和session结合使用**
```
cookie和session结合使用: web 开发发展至今, cookie 和 session 的使用已经出现了一些
非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:
存储在服务端:通过 cookie 存储一个 session_id ,然后具体的数据则是保存
在 session 中。如果用户已经登录,则服务器会在 cookie 中保存一个 session_id ,下
次再次请求的时候,会把该 session_id 携带上来,服务器根
据 session_id 在 session 库中获取用户的 session 数据。就能知道该用户到底是谁,以
及之前保存的一些状态信息。这种专业术语叫做 server side session 。存储在服务器的
数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器
的资源,但现在服务器已经发展至今,一些 session 信息还是绰绰有余的。
将 session 数据加密,然后存储在 cookie 中。这种专业术语叫做 client side
session 。 flask 采用的就是这种方式,但是也可以替换成其他形式
```
***2.FLlask 操作Cookie***
```
cookies:在 Flask 中操作 cookie ,是通过 response 对象来操作,可以在 response 返回之
前,通过 response.set_cookie 来设置,这个方法有以下几个参数需要注意:
key:设置的cookie的key。
value: key对应的value。
max_age:改cookie的过期时间,如果不设置,则浏览器关闭后就会自动过期。
expires:过期时间,应该是一个 datetime 类型。
domain:该cookie在哪个域名中有效。一般设置子域名,比如 cms.example.com 。
path:该cookie在哪个路径下有效
```
1.设置Cookie
```
from flask import Flask,request,Response
from flask import Blueprint
loginUrl = Blueprint('login', __name__)
@loginUrl.route('/api/v1', methods=['GET', 'POST', 'DELETE'])
def loginRun():
resp = Response("小李哥运维") #http响应
resp.set_cookie('username','breaklinux') #设置http cookie
return resp
```
2.验证浏览器写入Cookie
1.查看方法一
windows 打开浏览器访问路由 按F12 选择Network 查看访问请求
![111.jpg](http://www.icode9.com/i/li/?n=2&i=images/20210615/1623689748754693.jpg?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
2.查看方法2
3.查看方法3 (建议使用方法三查看准确性高)
![222.jpg](http://www.icode9.com/i/li/?n=2&i=images/20210615/1623689759776776.jpg?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
2.删除Cookie
```
@loginUrl.route('/del-cookie/', methods=['GET', 'POST', 'DELETE'])
def delete_cookie():
resp = Response("删除小李哥运维Cookie")
resp.delete_cookie('username')
return resp
```
3.设置cookie过期时间
方法1
```
def loginRun():
resp = Response("小李哥运维设置cookie")
resp.set_cookie('username','breaklinux',max_age=60) #设置60秒后cookie过期
return resp
验证设置是否生效
```
方法2
```
from datetime import datetime
def loginRun():
resp = Response("小李哥运维设置cookie")
expires = datetime(year=2021,month=12,day=11,hour=16,minute=0,second=0) #指定2021年12月12日凌晨0时0分0秒
#使用 expires参数,就必须使用格林尼治时间
#要相对北京时间少8小时
resp.set_cookie('username','breaklinux',expires=expires) #加8小时 东八时区
return resp
验证方法
```
距离现在时间
```
from datetime import datetime,timedelta
@loginUrl.route('/api/v1', methods=['GET', 'POST', 'DELETE'])
def loginRun():
resp = Response("小李哥运维设置cookie")
expires= datetime.now() + timedelta(days=30,hours=16) #距离现在的时间
#使用 expires参数,就必须使用格林尼治时间
#要相对北京时间少8小时
resp.set_cookie('username','breaklinux',expires=expires) #加8小时 东八时区
return resp
```