✨✨ 欢迎大家来到景天科技苑✨✨
?? 养成好习惯,先赞后看哦~??
? 作者简介:景天科技苑
?《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。
?《博客》:Python全栈,前后端开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,面试宝典等分享。
所属的专栏:flask框架零基础,进阶应用实战教学
景天的主页:景天科技苑
文章目录
http的会话控制Cookie1.设置cookie2.获取cookie3.删除cookieSession1.设置session2.设置session有效期4.获取session5.删除session
http的会话控制
所谓的会话(session),就是客户端浏览器和服务端网站之间一次完整的交互过程.
会话的开始是在用户通过浏览器第一次访问服务端网站开始.
会话的结束时在用户通过关闭浏览器以后,与服务端断开.
所谓的会话控制,就是在客户端浏览器和服务端网站之间,进行多次http请求响应之间,记录、跟踪和识别用户的信息而已。
为什么要有会话控制?因为 http 是一种无状态协议,浏览器请求服务器是无状态的。
无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,对于服务端而言,客户端的每次请求都是一次新的请求。
无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且客户端也会在处理页面完毕之后销毁页面对象。
有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
实现状态保持主要有两种方式:
在客户端存储信息使用Cookie(废弃),token[jwt,oauth]
在服务器端存储信息使用Session
,数据库 Cookie
Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就随着请求头自动发送该Cookie给服务器(前提是浏览器设置为启用cookie)。
Cookie的key/value可以由服务器端自己定义。
使用场景: 登录状态, 浏览历史, 网站足迹,购物车 [不登录也可以使用购物车]
Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用
Cookie基于域名安全,不同域名的Cookie是不能互相访问的
如访问fuguang.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到fuguang.com写的Cookie信息,只能获取到baidu.com的Cookie信息。
浏览器的同源策略针对cookie也有限制作用.
当浏览器请求某网站时,浏览器会自动将本网站下所有Cookie信息随着http请求头提交给服务器,所以在request中可以读取Cookie信息
1.设置cookie
设置cookie需要通过flask的Response响应对象来进行设置,由响应对象会提供了方法set_cookie给我们可以快速设置cookie信息。
视图函数如下:
@app.route("/set_cookie")def set_cookie(): """设置cookie,通过response传递到客户端进行保存""" response = make_response('默认首页') response.set_cookie('username', 'jingtian') # session会话期有效,关闭浏览器后当前cookie就会被删除 如果没有设置max_age,则当前cookie变量会在浏览器关闭(会话结束以后被浏览器删除) response.set_cookie('user', 'jigntian', max_age=30 ) # 指定有效时间,过期以后浏览器删除cookie,max_age=30秒 return response
浏览器查看cookie
2.获取cookie
#获取cookie@app.route("/get_cookie")def get_cookie(): """获取来自客户端的cookie""" print(request.cookies) # ImmutableMultiDict([]) username = request.cookies.get('username') # 没有值则返回None user = request.cookies.get('user') # 没有值则返回None print(f"username={username},user={user}") # username=xiaoming,user=xiaoming return "get cookie"
浏览器访问
终端打印,失效的cookie获取不到位None
3.删除cookie
cookie保存客户端浏览器中的,所以服务端无法直接删除cookie
要实现删除cookie,只能告诉浏览器,cookie过期了,让浏览器自动删除
删除cookie,重新设置cookie的时间,让浏览器自己根据有效期来删除
#删除cookie@app.route("/del_cookie")def del_cookie(): response = make_response('del cookie') # 删除操作肯定是在浏览器完成的,所以我们重置下cookie名称的对饮有效时间为0,此时cookie的值已经不重要了。 response.set_cookie('user', '', max_age=0) response.set_cookie('username', '', max_age=0) return response
浏览器访问,课件浏览器cookie已被删除
完整代码:
from flask import Flask, make_response,request# 应用实例对象app = Flask(__name__)#设置cookie@app.route("/set_cookie")def set_cookie(): """设置cookie,通过response传递到客户端进行保存""" response = make_response('默认首页') response.set_cookie('username', 'jingtian') # session会话期有效,关闭浏览器后当前cookie就会被删除 response.set_cookie('user', 'jigntian', max_age=30 ) # 指定有效时间,过期以后浏览器删除cookie,max_age=30秒 return response#获取cookie@app.route("/get_cookie")def get_cookie(): """获取来自客户端的cookie""" print(request.cookies) # ImmutableMultiDict([]) username = request.cookies.get('username') # 没有值则返回None user = request.cookies.get('user') # 没有值则返回None print(f"username={username},user={user}") # username=jigntian,user=jigntian return "get cookie"#删除cookie@app.route("/del_cookie")def del_cookie(): # cookie保存客户端浏览器中的,所以服务端无法直接删除cookie # 要实现删除cookie,只能告诉浏览器,cookie过期了,让浏览器自动删除 """删除cookie,重新设置cookie的时间,让浏览器自己根据有效期来删除""" response = make_response('del cookie') # 删除操作肯定是在浏览器完成的,所以我们重置下cookie名称的对饮有效时间为0,此时cookie的值已经不重要了。 response.set_cookie('user', '', max_age=0) response.set_cookie('username', '', max_age=0) return responseif __name__ == '__main__': # 启动项目的web应用程序 app.run(host="0.0.0.0", port=5000, debug=True)
cookie各阶段操作流程
Session
对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如手机号、验证码等信息
在服务器端进行状态保持的方案就是Session
Session依赖于Cookie,session的ID一般默认通过cookie来保存到客户端。名字一般叫:session
flask中的session需要加密,所以使用session之前必须配置SECRET_KEY选项,否则报错.
如果将来希望session的生命周期延长,可以通过修改cookie中的sessionID的有效期来完成配置。
session实现方案
注意:一般框架都是把session数据保存到服务端,但是,flask里面的session是基于token方式存储在客户端的,并没有按照传统的方式保存在服务端的文件中。
session的ID存在有效期的,默认是会话期,会话结束了,session_id就废弃了。
1.设置session
设置session视图函数如下:
#因为falsk中的session是基于cookie加密实现的,所以使用之前必须设置SECRET_KEY选项
app.config['SECRET_KEY'] = 'dafssg231bfvxvdsfwrqdqfafaffsgsbfsfsgs'#设置session@app.route("/set_session")def set_session(): """设置session""" session['username'] = 'jingtian' session['info'] = { "name": "jingtian", "age": 16, } print(session,type(session)) return "set_session"
浏览器访问,session保存到客户端的cookie中
看下session和类型
2.设置session有效期
后端Flask跟浏览器交互默认情况下,session cookie会在用户关闭浏览器时清除。
通过将session.permanent属性设为True可以将session的有效期延长为31天,也可以通过操作app的配置PERMANENT_SESSION_LIFETIME来设置session过期时间。
设置有效期,需要到导包
from datetime import timedelta# 以下两步设置过期时间session.permanent = True # 开启设置有效期,默认为31天后过期app.permanent_session_lifetime = timedelta(minutes=10)return "set_session"
浏览器访问,可以看到session有效期为10分钟
4.获取session
@app.route("/get_session")def get_session(): """获取session""" print(session.get('username')) print(session.get('info')) return "get session"
浏览器访问
终端打印session
5.删除session
@app.route("/del_session")def del_session(): """删除session,键如果不存在,则会抛出异常,所以删除之前需要判断键是否存在。""" if "username" in session: session.pop("username") if "info" in session: session.pop("info") return "del_session"
浏览器访问,session被删除
完整代码:
from flask import Flask, sessionfrom datetime import timedelta# 应用实例对象app = Flask(__name__)#因为falsk中的session是基于cookie加密实现的,所以使用之前必须设置SECRET_KEY选项app.config['SECRET_KEY'] = 'dafssg231bfvxvdsfwrqdqfafaffsgsbfsfsgs'#设置session@app.route("/set_session")def set_session(): """设置session""" session['username'] = 'jingtian' session['info'] = { "name": "jingtian", "age": 16, } print(session,type(session)) # 以下两步设置过期时间 session.permanent = True # 开启设置有效期,默认为31天后过期 app.permanent_session_lifetime = timedelta(minutes=10) return "set_session"#获取session@app.route("/get_session")def get_session(): """获取session""" print(session.get('username')) print(session.get('info')) return "get session"#删除session@app.route("/del_session")def del_session(): """删除session,键如果不存在,则会抛出异常,所以删除之前需要判断键是否存在。""" if "username" in session: session.pop("username") if "info" in session: session.pop("info") return "del_session"if __name__ == '__main__': # 启动项目的web应用程序 app.run(host="0.0.0.0", port=5000, debug=True)
使用过程中,session是依赖于Cookie的,所以当cookie在客户端被删除时,对应的session就无法被使用了。
总结:
综上,就是falsk通过cookie和session来控制http会话的全部解析,通常我们可以用cookie和session来保持用户登录等,喜欢的朋友可以一键三连,falsk持续更新中,总有适合你的!!!