cookie和session
cookie:
-
cookie
:在网站中,http
请求是无状态的,也就是说即使第一次和服务器连接后并且登陆成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie
的出现就是为了解决这个问题的,第一次登录后服务器返回一些数据(cookie)
给浏览器,然后浏览器保存在本地。当该用户发送第二次请求的时候,就会自动把上次请求存储的cookie
数据自动携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie
存储的数据有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie
只能存储一些小量的数据。
如果服务器返回了
cookie
给浏览器,那么浏览器下次再请求相同的服务器的时候,就会自动的把cookie
发送给浏览器,这个过程,用户根本不需要管cookie
是保存在浏览器中的,相对的是浏览器
session:
-
session
和cookie
的作用有点类似,都是为了存储用户相关的信息,不同的是,cookie
是存储在本地浏览器。而session
存储在服务器。存储在服务器的数据更加安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但服务器发展至今,存储一些session
信息还是绰绰有余的。
-
使用session的好处:
- 敏感数据不是直接发送回浏览器,而是发送回一个
session_id
,服务器将session_id
和敏感数据做一个映射存储在session
(在服务器上面)中,更加安全。 -
session
可以设置过期时间,也从另外一方面保证了用户的账号安全。
cookie
与session
都是存储数据的一种方式,有session
就一定会有cookie
,两者之间就像是孪生兄弟 - 敏感数据不是直接发送回浏览器,而是发送回一个
flask中的session工作机制:
-
flask
中的session
工作机制是:把敏感数据经过加密后放入session
中,然后把session_id
存放到cookie
中,下次请求的时候,再从浏览器发送过来的cookie
中读取session
,然后再从session
中读取敏感数据,并进行加密,获取最终的用户数据。
flask
的这种session
机制,可以节省服务器的占用,因为把所有的信息都存储在客户端(浏览器)。安全是相对的,把
session
放到cookie
中,经过加密,也是比较安全的。
flask中使用cookie和session
- cookie:在Flask中操作cookie,是通过resonse对象来操作的,可以在response返回之前,通过response.set_cookie来设置,这个方法有以下几个参数需要注意:
- key: 设置的cookie的key
- value:key对应的value
- max_age:改cookie的过期时间,如果不设置,则浏览器关闭后就会自动过期
- expires:过期时间,应该是一个datetime类型
- domain:该cookie在哪个域名中有效,一般设置子域名,比如cms.example.com
- path:该cookie在哪个路劲下有效
- session:Flask中的session是通过from flask import session,然后添加值key和value进去即可。并且,Flask中的session机制是将session信息加密,然后存储在cookie中
专业术语叫做client side session
操作session:
- session的操作方式:
- 使用
session
需要从flask
中导入session
,以后所有和session
相关的操作而是通过这个变量来
经行的 - 使用
session
设置SECRET_KEY
,用来作为加密用的,并且这个SECRET_KEY
如果每次服务器启动都变化的话,那么之前的session
就不能通过当前这个SECRET_KEY
进行加密了。 - 操作
session
的时候,跟操作字典是一样的 - 添加
session
:session['key']= 'value'
- 删除
session.pop('key')
或者del sesson['key']
- 清除所有
session
:session.clear()
- 获取
session
:session.get('key')
代码:
from flask import Flask, session
import os
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
# 添加数据到session中
# 操作session的时候,跟操作字典是一样的
@app.route('/')
def index():
session['username'] = 'zhiliao'
return 'Hello World!'
@app.route('/get/')
def get():
# session['username']当username不存在是会抛出异常
# session.get('username')当username不存在时,会返回None
return session.get('username')
@app.route('/delete/')
def delete():
print(session.get('username'))
session.pop('username')
print(session.get('username'))
return 'success'
@app.route('/clear/')
def clear():
print(session.get('username'))
# 删除session中的所有数据
session.clear()
print(session.get('username'))
return 'success'
if __name__ == '__main__':
app.run(debug=True)
设置session的过期时间
如果没有指定session的过期时间,那么默认是浏览器关闭后就自动结束。session.permanent = True在flask下则可以将有效期延长至一个月。下面有方法可以配置具体多少天的有效期。
- 如果没有指定session的过期时间,那么默认是浏览器关闭后就自动结束
- 如果设置了session的permanent属性为True,那么过期时间是31天。
- 可以通过给app.config设置PERMANENT_SESSION_LIFETIME来更改过期时间,这个值的数据类型是datetime.timedelay类型。
使用的需求:
- 1.在登录网页界面,下面有一个“记住我”选项,如果点击了则设置session的有效期长一点。就是设置这个!
复制代码
# 设置session
@app.route('/')
def set():
session['username'] = 'zhiliao'
session.permanent = True # 长期有效,一个月的时间有效
return 'success'
一种更先进的配置有效期的方法:(比如配置7天有效)
- 1.引入包:from datetime import timedelta
- 2.配置有效期限:app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7) # 配置7天有效
- 3.设置:session.permanent = True
#encoding: utf-8
from flask import Flask,session
from datetime import timedelta
import os
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7) # 配置7天有效
# 设置session
@app.route('/')
def set():
session['username'] = 'liefyuan'
session.permanent = True
return 'success'