一、会话技术详细过程
在浏览器中输入域名url,会经过dns服务器将域名解析成ip返回后,浏览器发送request对象请求给服务器,服务器收到请求后创建一个session对象,该对象会有个session_key的值,服务器会将该值以set_cookie消息头的形式发送给浏览器,浏览器接收到后,会将session_key的变量定义为session_id,session_id会存储在cookie中,当浏览器再次访问时,就会携带着session_id去服务器找对应的数据。
二.Cookie
1.Cookie介绍
Cookie是一种客户端会话技术,所有数据存储在客户端,其是以key-value进行数据存储层,服务器中是不做任何存储。
其特性:
- 支持过期时间
max_age 毫秒
expries 具体日期 - 根据域名进行cookie存储
- 不能跨网站(域名)
- 不能跨浏览器
- 自动携带本网站的所有cookie
Cookie是服务器操作客户端的数据,通过Response进行操作。
2.Cookie登陆使用
设置cookie response.set_cookie('username',username) 获取cookie username = request.cookies.get('username','游客') 删除cookie response.delete_cookie('username')
登录案例:
(1)执行tologinCookie跳转到loginCookie的页面,再页面中输入名字,点击提交
(2)跳转到welcomeCookie页面,显示 欢迎xxx来到英雄联盟
(3)如果登陆进入到了welcomeCookie的页面,在欢迎xxx来到英雄联盟的下面有一个退出,点击退出之后,显示欢迎游客来到英雄联盟。
在视图函数中添加:
# 跳转到登陆的页面 @blue.route('/toLoginCookie/') def toLoginCookie(): return render_template('loginCookie.html')
在模板中创建loginCookie.html文件
#避免写硬代码,使用反向解析url_for <form action="{{ url_for('blue.loginCookie') }}" method="post"> <input type="text" name="name"> <button>提交</button> </form>
运行结果:
提交之后 执行的action的路由
@blue.route('/loginCookie/', methods=['get', 'post']) def loginCookie(): name = request.form.get('name') response = redirect(url_for('blue.welcomeCookie')) response.set_cookie('name', name) return response
@blue.route('/welcomeCookie/') def welcomeCookie(): # get方法如果可以获取name值,那么就会得到name值;如果获取不到,那么就给默认值 name = request.cookies.get('name', '游客') return render_template('welcomeCookie.html', name=name)
在模板中创建welcomeCookie.html文件
欢迎{{ name }}来到英雄联盟 <br> {% if name == '游客' %} <a href="{{ url_for('blue.toLoginCookie') }}">登陆</a> {% else %} <a href="{{ url_for('blue.logout') }}">退出</a> {% endif %}
运行结果:
点击退出之后,显示欢迎游客来到英雄联盟。
@blue.route('/logout/') def logout(): response = redirect(url_for('blue.welcomeCookie')) # 清除cookie response.delete_cookie('name') return response
运行结果:
三.Session
1.Session介绍
session是一种服务端会话技术,其把所有数据存储在服务器中,默认存在服务器的内存中,其的存储结构也是key-value形式。
注意:
单纯的使用session是会报错的,需要使用在__init__方法中配置app.config[‘SECRET_KEY’]=‘110’。
django中的session默认做了数据持久化(存在了数据库中)
2.Session登陆使用
设置 session['username'] = username 获取 session.get('username') 删除 resp.delete_cookie('session') 或者 session.pop('username')
登陆案例,如cookie一样:
在views中:
@blue.route('/toLoginSession/') def toLoginSession(): return render_template('loginSession.html') @blue.route('/loginSession/',methods=['get','post']) def loginSession(): name = request.form.get('name') session['name']=name return redirect(url_for('blue.welcomeSession')) @blue.route('/welcomeSession/') def welcomeSession(): name = session.get('name','游客') return render_template('welcomeSession.html',name=name) @blue.route('/logoutSession/') def logoutSession(): # session.pop('name') response = redirect(url_for('blue.welcomeSession')) # 删除cookie的key值叫做session response.delete_cookie('session') return response
创建loginSession.html文件:
<body> <form action="{{ url_for('blue.loginSession') }}" method="post"> <input type="text" name="name"> <button>提交</button> </form> </body>
创建welcomeSession.html文件:
<body> 欢迎{{ name }}光临 <a href="{{ url_for('blue.logoutSession') }}">退出</a> </body>
运行结果:
如果出现上面的报错,那么可能就是你没有在init文件中添加app.config[‘SECRET_KEY’]=‘110’。(110:此数字不固定,可填你喜欢的数字)
添加之后,则会运行成功。
3.Session持久化问题
(1)持久化简介
1.django中对session做了持久化,存储在数据库中
2.flask中没有对默认session进行任何处理
- flask-session 可以实现session的数据持久化
- 可以持久化到各种位置,更推荐使用redis
- 缓存在磁盘上的时候,管理磁盘文件使用lru, 最近最少使用原则
(2)持久化实现方案
a.安装flask-session
pip install flask-session
b.初始化Session对象
持久化的位置:配置init中 app.config[‘SESSION_TYPE’] = ‘redis’
c.如果指定的持久化的位置是redis,那么我们就需要依赖于redis的库,所以需要pip install redis
d.创建Sessin的对象(2种):
(1) Sesssion(app=app)
(2) session = Session()
session.init_app(app=app)
e.需要配置SECRET_KEY=‘110’
持久化的时候,是不需要写secret_key的,但是为了数据安全,强制性添加
f.存储到redis中的数据的前缀设置
app.config[‘SESSION_KEY_PREFIX’]=‘flask’
flask的session的生存时间是31天,django的session生存时间是14天
cookie和session总结
- cookie: 客户端浏览器的缓存;session: 服务端服务器的缓存
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie
- 可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中