• Flask快速入门(7) — session


    除请求对象之外,还有一个 session 对象。它允许你在不同请求间存储特定用户的信息。本质上是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,所以你需要设置一个密钥secret_key

    使用方法:

    a.导入session:from flask import session
    b. 设置秘钥:app.secret_key = 'dsfds' (任意字符串)
    c. 设置session:session['username'] = 'bob'
    d. 获取session:session['username']
    e. 删除:session.pop('username', None)

    from flask import Flask,session
    
    app = Flask(__name__)
    app.debug=True
    app.secret_key = 'sadsfasdf'
    
    @app.route('/')
    def index():
        session['name'] = 'nick'  # 设置session 
        return '首页'
    
    @app.route('/test')
    def test():
        print(session['name']) 
        return '获取session'
    
    if __name__ == '__main__':
        app.run()
        
    # 在django中发生三件事,1,生成一个随机的字符串 2 往数据库存 3 写入cookie返回浏览器
    # 在flask中他没有数据库,但session是怎样实现的?
    	# 生成一个密钥写入这个cookie,然后下次请求的时候,通过这个cookie解密,然后赋值给session
        # 我们通过app.session_interface来查看
    

    app.session_interface中的save_session设置cookie的参数

    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:
                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))  
        # save session时是在这里设置了cookie
        response.set_cookie(
            app.session_cookie_name,  # cookie的name就是配置中的ConfigAttribute("SESSION_COOKIE_NAME"),默认是‘session’
            val,  # 对session转成以字典的形式加密进行序列化,存入到cookie的值中
            expires=expires,  # 过期时间
            httponly=httponly,
            domain=domain,
            path=path,
            secure=secure,
            samesite=samesite,
        )
    

    app.session_interface中save_session的参数(设置cookie的参数)

    key,  # 键
    value='',  # 值
    max_age=None,  # 超时时间 cookie需要延续的时间(以秒为单位)如果参数是 None`` ,这个cookie会延续到浏览器关闭为止
    expires=None,  # 超时时间(IE requires expires, so set it if hasn't been already.)
    path='/',  # Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问,浏览器只会把cookie回传给带有该路径的页面,这样可以避免将cookie传给站点中的其他的应用。
    domain=None,  # Cookie生效的域名 你可用这个参数来构造一个跨站cookie。如, domain=".example.com" 所构造的cookie对下面这些站点都是可读的:www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。如果该参数设置为 None ,cookie只能由设置它的站点读取
    secure=False,  # 浏览器将通过HTTPS来回传cookie
    httponly=False  # 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
    

    app.session_interface中的open_session设置获取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)  # 从cookies中获取session
        if not val:
            return self.session_class()
        max_age = total_seconds(app.permanent_session_lifetime)
        try:
            data = s.loads(val, max_age=max_age)  # loads解析数据获取session值
            return self.session_class(data)
        except BadSignature:
            return self.session_class()
    

    session源码的执行流程

    -save_seesion
    	-响应的时候,把session中的值加密序列化放大到了cookie中,返回到浏览器中
    -open_session
    	-请求来了,从cookie中取出值,反解,生成session对象,以后再视图函数中直接用sessoin就可以了。
    
  • 相关阅读:
    ESX主机修改root密码
    freebsd关闭sendmail服务
    bind9在view情况下通过TSIG key实现nsupdate功能
    freebsd安装perl
    freebsd开启ssh
    bind9在多view情况下通过TSIG key实现主dns和多个辅DNS的同步传输
    (转)linux 系统的虚拟机克隆后出现找不到eth0
    首次发现linux+lamp环境下安装drupal7出现的一个错误。
    freebsd安装bind9.9.1P2
    无法在 vSphere Client 上启用 Update Manager 插件
  • 原文地址:https://www.cnblogs.com/863652104kai/p/11679776.html
Copyright © 2020-2023  润新知