flask之cookie与session区别
用户身份校验是web访问时的重要步骤。常用的身份校验方式有cookie,session和jwt三种。其中cookie和session是较传统的校验方式,其采用将用户信息保存在服务器或浏览器中,用户访问时,携带相关信息,有服务器进行校验。最近流行的JWT令牌是一种分布式的跨域验证机制造。其允许跨域,另外将token保存到浏览器,避免了采用数据库保存用户信息。在分布式服务器运行场合,其校验更加简单,高效。其由头部,载荷和签名三部分组成。头部一般是token的类型、加密方式的声明信息;载荷部分是token的用户身份信息,头部和载荷均采用base64算法进行加密。通过base64解密即可查阅用户信息,因此一般存放的是用户非机密信息。签名部分是通过将头部,载荷部分以及用户的加密字段进行加密生成的字符串,这部分信息用来验证令牌的有效性。
1.flask中session的保存有两种:自带的session类和flask_session包。自带的session类中,其session信息是保存在浏览器内,而非客户端。而采用flask_session包可以改变session的存储位置,可以存储到redis,sqlalchemy,mongodb,缓存等数据库中。利用session记录用户登录次数:
app=Flask(__name__) app.secret_key="hellobaby"#用于加密session信息 #用户登陆后设置session信息 @app.route("/user") def index(): session["name"]="hello,user" session["count"]=1 return "hello," #记录用户登陆的次数, @app.route("/hello") def user(): name=session.get("name") count=session.get("count") print(count,9999) if not all([name,count]): return "请登陆" num=count+1 session["count"]=num return str(num) if __name__ == '__main__': app.run(port=5006) 结果:查询session信息,因是加密,信息较安全。 Cookie:session=eyJjb3VudCI6MSwibmFtZSI6ImhlbGxvLHVzZXIifQ.EBTDCw.SKWftLjBdc-IiGlWqcgrS16BzHg
2.利用cookie记录用户登录次数
#用户登陆后设置cookie信息 @app.route("/user") def index(): resp=Response("hello") resp.set_cookie("name","user1",3600) resp.set_cookie("count", "1", 3600)#cookie的值1为str return resp #记录用户登陆的次数, @app.route("/hello") def user(): name=request.cookies.get("name") count=request.cookies.get("count") print(count,9999) if not all([name,count]): return "请登陆" num=str(int(count)+1) resp=Response(num) resp.set_cookie("count", num, 3600) return resp if __name__ == '__main__': app.run(port=5006)
调试:
虽然cookie可以保存用户信息,但信息较透明,容易被窃取。例如 获取到的信息: Cookie:name=user1; count=4
3.基于flask_session包进行session信息的保存,其可以选择将session信息保存在redis,缓存或sqlalchemy,关系型数据库等。
app=Flask(__name__) # app.secret_key="hellobaby"#用于加密session信息 class App_Config(): SECRET_KEY="20e4f6b0-b631-4582-b2e0-00190c7d006f" SESSION_TYPE="redis" SESSION_PERMANENT=False SESSION_USE_SIGNER=True PERMANENT_SESSION_LEFTTIME=86400*2 SESSION_REDIS=StrictRedis(host="127.0.0.1",port=6379)#建立redis连接 app.config.from_object(App_Config) session1=Session(app) #用户登陆后设置cookie信息 @app.route("/user") def index(): session["name"]="user1" session["count"]=1 return " login sccess" #记录用户登陆的次数, @app.route("/hello") def user(): name=session.get("name") count=session.get("count") print(count,9999) if not all([name,count]): return "请登陆" num=str(int(count)+1) resp=Response(num) session["count"] = num return resp if __name__ == '__main__': app.run(port=5006)