当前位置:   article > 正文

Flask内置的session使用与介绍_flask如何设置session

flask如何设置session

cookie 的使用

from flask import make_response
res=make_response(render_template('home.html'))
res.set_cookie('name','lqz')
# delete_cookie
  • 1
  • 2
  • 3
  • 4

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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,
        )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/540561
推荐阅读
相关标签
  

闽ICP备14008679号