Flask内置的session使用与介绍

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,
        )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值