所谓的会话,就是客户端浏览器和服务端网站之间一次完整的交互过程.
会话的开始是在用户通过浏览器第一次访问服务端网站开始.
会话的结束时在用户通过关闭用户上网的访问代理以后,与服务端断开.
所谓的会话控制,就是在客户端浏览器和服务端网站之间,进行多次http请求响应之间,记录、跟踪和识别用户的信息而已。
因为 http 是一种无状态协议,浏览器请求服务器是无状态的。
无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。
有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
实现状态保持主要有两种类型:
-
在客户端存储信息使用
url
,Cookie
,token令牌[jwt.csrf,oauth]
-
在服务器端存储信息使用
Session
cookie
Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie的key/value可以由服务器端自己定义。
Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用
Cookie基于域名安全,不同域名的Cookie是不能互相访问的
浏览器的同源策略针对cookie也有限制作用.
当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息
设置,获取,删除cookie
from flask import Flask,make_response,request app = Flask(__name__) @app.route("/set_cookie") def set_cookie(): """设置cookie""" response = make_response("ok") # response.set_cookie(key="变量名",value="变量值",max_age="有效时间/秒") response.set_cookie("username","xiaoming",100) """如果cookie没有设置过期时间,则默认过期为会话结束过期""" """cookie在客户端中保存时,用一个站点下同变量名的cookie会覆盖""" response.set_cookie("age","100") return response @app.route("/get_cookie") def get_cookie(): """获取cookie""" print(request.cookies) print(request.cookies.get("username")) print(request.cookies.get("age")) """打印效果: {'username': 'xiaoming'} """ return "" @app.route("/del_cookie") def del_cookie(): """删除cookie""" response = make_response("ok") #把对应名称的cookie设置为过期时间,则可以达到删除cookie response.set_cookie("username","",0) return response if __name__ == '__main__': app.run(debug=True)
session
from flask import Flask, make_response, request,session app = Flask(__name__) class Config(): SECRET_KEY = "123456asdadad" #加秘钥 DEBUG = True #打开测试开发模式 app.config.from_object(Config) # 查看当前flask默认支持的所有配置项 print(app.config) @app.route("/set_session") def set_session(): """设置session""" """与cookie不同,session支持python基本数据类型作为值""" session["username"] = "xiaohuihui" session["info"] = { "age":11, "sex":True, } return "ok" @app.route("/get_session") def get_session(): """获取session""" print( session.get("username") ) print( session.get("info") ) print( app.session_cookie_name ) return "ok" @app.route("/del_session") def del_session(): """删除session""" try: del session["username"] # session.clear() # 删除所有 except: pass return "ok" if __name__ == '__main__': app.run(debug=True)