1.0 cookie 与 session
1.1 cookie
- cookie :在网站中http 请求是无状态的,当我们第一次访问服务器登录成功后,第二次再去访问,服务器仍然不知道当前请求的是哪个用户
- cookie的出现就是为了解决这个问题,第一次登录服务器后,服务器返回一些数据(cookie)给浏览器,然后浏览器保存到本地,这样第二次访问服务器时,用户就会自动的把上次存储的cookie携带上,这样服务器就能通过浏览器携带的cookie知道是哪个用户访问了。
- cookie的存储数据量有限,各个浏览器大小略微不一样,但一般不超过4KB.
1.2 session
- session:session有点和cookie类似,都是存储用户信息的,不同的是cookie是存储在本地浏览器,session是一个概念,一个思路,一个服务器存储授权信息的解决方案,不同的服务器,不同的语言,不同的框架有不同的实现,虽然实现不一样,但是他们的目的都是为了方便存储数据的,session的出现是为了解决cookie存储数据不安全的问题。
- cookie和session结合使用,在如今的市场或者企业一般有两种存储方式
2.1 - 存储在服务端:
通过cookie存储一个session_id,具体的数据保存在session中,如果用户已登录,则服务器会在cookie中保存一个session_id,下次请求的时候则会把session.id携带上来,服务器根据session_id在session库中寻找session数据,则知道该用户的信息以及之前保存的状态信息,专业术语叫 server side session,存储在服务器的数据会更加的安全,不容易被窃取,但是存储在服务器也有弊端,就是会占用服务器的资源,但服务器发展至今,存储一些session的信息还是没问题的。
2.2 - 将session数据加密存储在cookie中,专业术语叫 client side session Flask采用的就是这种方式,不过也可以替换成其他的形式。
2.0 Flask中使用cookie和session
2.1 cookie使用
2.1.1 - 在flask中操作cookie是通过response对象来操作的,可以在response返回之前通过response.set_cookie来设置,有几个参数需要注意:
- key : 设置cookie的key
- value : key对应的value
- max_age : 改cookie的过期时间,如果不设置,关闭浏览器后就会过期
- expires : 过期时间,应该是datetime类型
- domain : 该cookie在哪个域名中有效,一般设置子域名,如:xms.eplle.com
- path : 在哪个路径下有效
from flask import Flask, Response, request
#Respone 设置connkie,
# 当我们的浏览器第一次访问服务器时候,输入用户信息登录前,服务器是无状态的,服务器响应后浏览器会自动创建cookie,
# 当下次在访问时,服务器就不再是无状态的,服务器就知道你是谁了,可以直接访问了
app = Flask(__name__)
@app.route('/')
def index():
res = Response('淘宝网')
res.set_cookie('username', 'cheney', max_age=60*60*24) #max_age设置存活时间1天
return res
if __name__ == '__main__':
app.run(debug=True)
2.2 session使用
Flask中session是通过 from flask import session ,然后添加key值和value值即可,并且flask中的session机制是将session信息加密,然后存储在cookie中,专业术语叫client side session。
from flask import Flask, session
import os
from datetime import timedelta
#session 加密
print(os.urandom(12)) #生成十二位随机密钥
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(12)
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=24) #设置session失效时间24小时
@app.route('/')
def indexx():
#它是一个字典
session['username'] = 'cheney'
# 过期时间设置
session.permanent = True
return '登录状态'
@app.route('/list/')
def ini():
username = session.get('username')
print(username)
return '宝宝'
@app.route('/logout/')#设置退出session
def logout():
#删除session
session.pop('username')
#进行清屏
session.clear()
return '退出登录状态'
if __name__ == '__main__':
app.run(debug=True)