在使用session之前必须现在设置一下密钥
app.secret_key="asdas" #值随便
在使用session之前必须现在设置一下cookies的键
app.config['SESSION_COOKIE_NAME']="keys"
除请求对象之外,还有一个 session 对象。它允许你在不同请求间存储特定用户的信息。它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设置一个密钥。 (app.session_interface对象)
from flask import Flask, session
app = Flask(__name__)
app.secret_key = 'waller123'
@app.route('/', methods=['GET', ])
def foo():
session['key'] = 'value' 设置session
return 'foo'
@app.route('/', methods=['GET', ])
def func():
session.pop('key', None) 删除session
return 'func'
在django中发什么三件事: 1,生成一个随机的字符串 2 往数据库存 3 写入cookie返回浏览器
在flask中他没有数据库,但session是怎样实现的?
1.生成一个密钥(基于设置的key与value生成)写入这个cookie,然后下次请求的时候,通过这个cookie解密,然后赋值给session
2.我们通过app.session_interface来查看
session源码
class Flask():
...
1.
def wsgi_app(self, environ, start_response):
# 将请求相关的数据environ封装到了request_context中
2.
ctx = self.request_context(environ) # ctx是RequestContext的对象, 封装了request和空session
error = None
try:
try:
3.
ctx.push() # ctx调用push方法, push是对象绑定方法, 默认将ctx传入
11.
response = self.full_dispatch_request() # 寻找视图函数并执行,这里会触发save_session的执行
class RequestContext(object):
4.
def push(self):
...
f self.session is None:
5.
# app.session_interface 是 SecureCookieSessionInterface() 的对象
session_interface = self.app.session_interface
6.
# 调用 SecureCookieSessionInterface() 中的 open_session方法
self.session = session_interface.open_session(self.app, self.request) # 给ctx.session赋值, 值就是空字典
class SecureCookieSessionInterface(SessionInterface):
7.
def open_session(self, app, request):
# 校验 secret_key 是否有值
s = self.get_signing_serializer(app)
if s is None:
return None
8.
val = request.cookies.get(app.session_cookie_name) # 获取前端传来的cookies
if not val: # 如果cookies为空
9.
# session_class 是 SecureCookieSession()
return self.session_class() # 相当于 SecureCookieSession() 实例化,返回一个存放session的空字典
class SecureCookieSession(CallbackDict, SessionMixin): CallbackDict继承的是Dict
10.
def __init__(self, initial=None):
def on_update(self):
self.modified = True
self.accessed = True
super(SecureCookieSession, self).__init__(initial, on_update)
12.
# 当在视图函数中为session设置值的时候 如: session['key'] = 'value', 触发的是SecureCookieSession中的__getitem__方法
def __getitem__(self, key):
self.accessed = True
return super(SecureCookieSession, self).__getitem__(key)
13.
def save_session(self, app, session, response):
...
源码的执行流程
-save_seesion
-响应的时候,把session中的值加密序列化放到了cookie中,返回到浏览器中
-open_session
-请求来了,从cookie中取出值,反解,生成session对象,以后再视图函数中直接用sessoin就可以了。
app.session_interface这里面看
存session,
1 调用save_session,将我们的session加密的val,读取配置文件['SESSION_COOKIE_NAME']得到key
2 将1中的key,val存储到cookies
取session
1 获取request里面的cookies,获取里面key,这个key就是['SESSION_COOKIE_NAME'],值就是加密的值
2 对该值进行解密
flask-session
作用:将默认保存的签名cookie中的值 保存到 redis/memcached/file/Mongodb/SQLAlchemy
pip3 install flask-session
使用
from flask import Flask,session
import redis
from flask_session import Session
app = Flask(__name__)
app.config['SESSION_TYPE'] = 'redis' # 连接redis
app.config['SESSION_REDIS'] =redis.Redis(host='127.0.0.1',port='6379')
app.config['SESSION_KEY_PREFIX']="session_prefix"
Session(app)
@app.route('/')
def hello_world():
session['key']='value'
return 'Hello World!'
@app.route("/index")
def index():
print(session['key'])
return "ok"
if __name__ == '__main__':
app.run()
内部是基于uuid4生成随机字符串,该字符串为键,用户设置的session['key']='value'为值存到redis中,将随机字符串返回给前端当做cookies的值
当请求来,根据随机字符串去redis中回去对应的值
redis中存储形式: '随机字符串' : {'key':'value'}