会话控制
所谓的会话,就是用户和浏览器中网站之间一次交互过程.
会话的开始是在用户打开浏览器以后第一次访问网站.
会话的结束时在用户关闭浏览器以后.
因为 http 是一种无状态协议,浏览器请求服务器是无状态的。
无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。
有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
实现状态保持主要有两种方式:
在客户端存储信息使用`Cookie,本地存储,token[jwt,oauth]`
在服务器端存储信息使用`Session`,redis
一.Cookie
Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie的key/value可以由服务器端自己定义。
使用场景: 登录状态, 浏览历史, 网站足迹,购物车 [不登录也可以使用购物车]
Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用
Cookie基于域名安全,不同域名的Cookie是不能互相访问的
如访问baidu.com时向浏览器中写了Cookie信息,使用同一浏览器访问souhu.com时,无法访问到baidu.com写的Cookie信息
浏览器的同源策略针对cookie也有限制作用.
当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息。
1.设置cookie
设置cookie需要通过flask的Response响应对象来进行设置,由flask内部提供了一个make_response函数给我们可以快速创建响应对象
from flask import Flask, make_response app = Flask(__name__) @app.route("/set_cookie") def cookie_demo(): response = make_response("make a cookie") # response.set_cookie("变量名", "变量值", max_age="有效期几秒") response.set_cookie("username", "zero", max_age=20) return response if __name__ == '__main__': app.run(port=5000, host='0.0.0.0', debug=True)
2.获取cookie
from flask import Flask from flask import request app = Flask(__name__) @app.route('/get_cookie') def resp_cookie(): resp = request.cookies.get('username') return resp if __name__ == '__main__': app.run(port=5000, host='0.0.0.0', debug=True) 需要先set cookie 再进行get cookie
注意:
如果没有先生产cookie,直接获取会报错。
二.Session
对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
在服务器端进行状态保持的方案就是`Session`
注意: **Session依赖于Cookie**,而且flask中使用session,需要配置SECRET_KEY选项,否则报错.
1.设置session
rom flask import Flask from flask import session app = Flask(__name__) # 声明一个配置类 class Config(object): SECRET_KEY = "DD434O7HQ2131!@#edn#hu!@!g@uWO1NS" # 加载配置 app.config.from_object(Config) @app.route('/set_session') def set_session(): session['username'] = 'one' return 'set session ok!' @app.route('/get_session') def get_session(): return session.get('username') if __name__ == '__main__': app.run(port=5000, host='127.0.0.1', debug=True)
2.获取session
删除一个session设置值为None,修改一个session重新赋值即可。