Flask Session

在使用session之前必须现在设置一下密钥

app.secret_key="asdas" #值随便

在使用session之前必须现在设置一下cookies的键

app.config['SESSION_COOKIE_NAME']="keys" 

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

from flask import Flask, session

app = Flask(__name__)

app.secret_key = 'waller123'

@app.route('/', methods=['GET', ])
def foo():
    session['key'] = 'value'  设置session
    return 'foo'

@app.route('/', methods=['GET', ])
def func():
    session.pop('key', None)  删除session
    return 'func'

在django中发什么三件事: 1,生成一个随机的字符串 2 往数据库存 3 写入cookie返回浏览器
在flask中他没有数据库,但session是怎样实现的?
    1.生成一个密钥(基于设置的key与value生成)写入这个cookie,然后下次请求的时候,通过这个cookie解密,然后赋值给session
    2.我们通过app.session_interface来查看 

session源码

class Flask():
    ...
    1.
    def wsgi_app(self, environ, start_response):
        # 将请求相关的数据environ封装到了request_context中
        2.
        ctx = self.request_context(environ)  # ctx是RequestContext的对象, 封装了request和空session
        error = None
        try:
            try:
                3.
                ctx.push()  # ctx调用push方法, push是对象绑定方法, 默认将ctx传入
                11.
                response = self.full_dispatch_request()  # 寻找视图函数并执行,这里会触发save_session的执行


class RequestContext(object):
    4.
    def push(self):
        ...
        f self.session is None:
            5.
            # app.session_interface 是 SecureCookieSessionInterface() 的对象
            session_interface = self.app.session_interface
            6.
            # 调用 SecureCookieSessionInterface() 中的 open_session方法
            
            self.session = session_interface.open_session(self.app, self.request)  # 给ctx.session赋值, 值就是空字典


class SecureCookieSessionInterface(SessionInterface):
    7.
    def open_session(self, app, request):
        # 校验 secret_key 是否有值
        s = self.get_signing_serializer(app)
        if s is None:
            return None
        8.
        val = request.cookies.get(app.session_cookie_name)  # 获取前端传来的cookies
        if not val:  # 如果cookies为空
            9.
            # session_class 是 SecureCookieSession() 
            return self.session_class()  # 相当于 SecureCookieSession() 实例化,返回一个存放session的空字典

class SecureCookieSession(CallbackDict, SessionMixin):  CallbackDict继承的是Dict
    10.
    def __init__(self, initial=None):
        def on_update(self):
            self.modified = True
            self.accessed = True
        super(SecureCookieSession, self).__init__(initial, on_update)
    12.
    # 当在视图函数中为session设置值的时候 如: session['key'] = 'value', 触发的是SecureCookieSession中的__getitem__方法
    def __getitem__(self, key):
        self.accessed = True
        return super(SecureCookieSession, self).__getitem__(key)
    13.
    def save_session(self, app, session, response):
        ...
    

源码的执行流程
-save_seesion
    -响应的时候,把session中的值加密序列化放到了cookie中,返回到浏览器中
-open_session
    -请求来了,从cookie中取出值,反解,生成session对象,以后再视图函数中直接用sessoin就可以了。

app.session_interface这里面看
存session,
1 调用save_session,将我们的session加密的val,读取配置文件['SESSION_COOKIE_NAME']得到key
2 将1中的key,val存储到cookies

取session
1 获取request里面的cookies,获取里面key,这个key就是['SESSION_COOKIE_NAME'],值就是加密的值
2 对该值进行解密

flask-session

作用:将默认保存的签名cookie中的值 保存到 redis/memcached/file/Mongodb/SQLAlchemy

pip3 install flask-session

使用

from flask import Flask,session
import  redis
from flask_session import Session
app = Flask(__name__)
app.config['SESSION_TYPE'] = 'redis'  # 连接redis
app.config['SESSION_REDIS'] =redis.Redis(host='127.0.0.1',port='6379')
app.config['SESSION_KEY_PREFIX']="session_prefix"
Session(app)

@app.route('/')
def hello_world():
    session['key']='value'
    return 'Hello World!'

@app.route("/index")
def index():
    print(session['key'])
    return "ok"

if __name__ == '__main__':
    app.run()

内部是基于uuid4生成随机字符串,该字符串为键,用户设置的session['key']='value'为值存到redis中,将随机字符串返回给前端当做cookies的值

当请求来,根据随机字符串去redis中回去对应的值

redis中存储形式: '随机字符串'  : {'key':'value'}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值