cookie 的使用
from flask import make_response
res=make_response(render_template('home.html'))
res.set_cookie('name','lqz')
# delete_cookie
session的使用
配置文件中可以修改 SESSION_COOKIE_NAME ; PERMANENT_SESSION_LIFETIME
from flask import Flask,session
app = Flask(__name__)
app.secret_key = 'ksdjklfsjdlfjks'
@app.route('/index/<int:pk>', methods=['get'], endpoint="index")
def index(pk):
session['name'] = "xxx"
return pk
session 直接导入,然后直接修改即可;最终会保存在浏览器的 cookie中,其中 key 默认为session ,可以通过app.config 进行修改
修改了session中相同的 key 的值之后,cookie 中存的session对应的值会发生改变
由于本质还是使用cookie,所以secret_key需要设置
session的执行原理
当后端使用了
session[key]=value
之后,处理完请求的所有逻辑并返回响应时 ===> 将session对象 序列化成字符串再加密,然后将其放在 cookie 中返回;所以每次修改了session之后,返回的字符串都会改变,修改时重写了
__setitems__
方法;浏览器下次发送请求时,只要处于同一个域,就会自动将 cookie 携带传给后端; 后端就会将session对应的字符串 反序列化称为session对象,其底层使用的就是pickle;
对比 Django
Django 的处理是在 session 中间件中进行处理的;
在process_response中:
Django 会将 session 对应的值序列化存入session 表中,并且会得到一个 sessionid;
然后将sessionid 放在 cookie 中返回给前端,下次前端来会携带自动携带;在process_request中:
Django 取出 sessionid 到表中去比对,对比成功则反序列化成对象;
session 源码
session.modified 其实就是修改了 session 对象的_ _ setitem_ _方法
# app.session_interface---> SecureCookieSessionInterface()类的对象
-open_session:请求来了,从cookie中取出字符串,把字符串反序列化成session对象
-save_session:请求走,把session对象,序列化成字符串,放到cookie中
# open_session
def open_session(self, app, request):
s = self.get_signing_serializer(app)
if s is None:
return None
val = request.cookies.get(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)
return self.session_class(data)
except BadSignature:
return self.session_class()
# save_session
def save_session(self, app, session, response):
domain = self.get_cookie_domain(app)
path = self.get_cookie_path(app)
if not session:
if session.modified:
"session.modified 其实就是修改了 session 对象的__setitem__方法"
response.delete_cookie(
app.session_cookie_name, domain=domain, path=path
)
return
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)
val = self.get_signing_serializer(app).dumps(dict(session))
response.set_cookie(
app.session_cookie_name,
val,
expires=expires,
httponly=httponly,
domain=domain,
path=path,
secure=secure,
samesite=samesite,
)