Flask 的 session
@app.route("/", )
def index():
# 如何设置sessoion
# 1 导入session
# 2 给sessoion设置值
# 设置 session
session['name'] = "santa"
session["nam1"] = "kai"
return "ok"
@app.route("/login/")
def login():
# 获取 session
# name = session.get('name')
print(session["name"]) # santa
return "login"
if __name__ == '__main__':
app.run()
分析 session 的原理
全局导入session,把session,当字典存值,取就当字典取值
原理之存session
当响应要返回给客户端时候,会调用 sesssion_interface 中的 save_session 法。把全局session字典做加密得到 val , 然后将这个 val 设置到 cookie 中。
cookie 的键为配置文件中的 session_cookie_name , 值就是我们session字典加密得到的结果
原理之取 session
当flask接收到请求的时候,会调用 sesssion_interface 中的 open_session 方法,该方法中从 cookie中取键为配置文件中 session_cookie_name 的 cookie 值,得到这个值以后呢,做解密。
然后赋值给全局的 session 字典。这样我们就可以取到之前 flask 设置 session
注意:用 session 必须配置 app.secret_key="随便"
class SecureCookieSessionInterface(SessionInterface):
salt = "cookie-session"
digest_method = staticmethod(hashlib.sha1)
key_derivation = "hmac"
serializer = session_json_serializer
session_class = SecureCookieSession
def get_signing_serializer(self, app):
if not app.secret_key:
return None
signer_kwargs = dict(
key_derivation=self.key_derivation, digest_method=self.digest_method
)
return URLSafeTimedSerializer(
app.secret_key,
salt=self.salt,
serializer=self.serializer,
signer_kwargs=signer_kwargs,
)
# 取session的时候执行的
def open_session(self, app, request):
s = self.get_signing_serializer(app)
if s is None:
return None
##cookie键是SESSION_COOKIE_NAME"=session
val = request.cookies.get(app.session_cookie_name)
print("open_session.session_cookie_name,", app.session_cookie_name, )
if not val:
return self.session_class()
max_age = total_seconds(app.permanent_session_lifetime)
try:
data = s.loads(val, max_age=max_age)
print("self.session_class(data)", self.session_class(data) )
return self.session_class(data)
except BadSignature:
return self.session_class()
#存session的时候执行的
def save_session(self, app, session, response):
domain = self.get_cookie_domain(app)
path = self.get_cookie_path(app)
# If the session is modified to be empty, remove the cookie.
# If the session is empty, return without setting the cookie.
if not session:
if session.modified:
response.delete_cookie(
app.session_cookie_name, domain=domain, path=path
)
return
# Add a "Vary: Cookie" header if the session was accessed at all.
if session.accessed:
response.vary.add("Cookie")
if not self.should_set_cookie(app, session):
return
httponly = self.get_cookie_httponly(app)
secure = self.get_cookie_secure(app)
samesite = self.get_cookie_samesite(app)
expires = self.get_expiration_time(app, session)
# 把session做了一个加密,把整个session的key--》val,全部加密,的到一个value值,
#session是一个大字典,
val = self.get_signing_serializer(app).dumps(dict(session))
# 他把session加密后得到的val存到cookie里面了
#cookie键是SESSION_COOKIE_NAME"=session
print("源码中的session",dict(session))
print("app.session_cookie_name,",app.session_cookie_name,)
response.set_cookie(
app.session_cookie_name,
val,
expires=expires,
httponly=httponly,
domain=domain,
path=path,
secure=secure,
samesite=samesite,
)