zoukankan      html  css  js  c++  java
  • 11.4 Flask session,闪现

    session

    加密后放在用户浏览器的 cookie 中 

    于django 的自带session 不同,flask 的 session 需要导入

    from  flask import session

    添加密钥

    app.secret_key = "sdfsdgrgasdgewrgw"

    内部流程

    # - Flask中的session处理机制(内置:将session保存在加密cookie中实现)
        # - 请求刚到来:获取随机字符串,存在则去“数据库”中获取原来的个人数据
        # 否则创建一个空容器。 --> 内存:对象(随机字符串,{放置数据的容器})
            # 1. obj = 创建SecureCookieSessionInterface()
            # 2. obj = open_session(self.request) = SecureCookieSession()
            # self.session = SecureCookieSession()对象。
            # self.session = self.app.open_session(self.request)
        # - 视图:操作内存中 对象(随机字符串,{放置数据的容器})
        # - 响应:内存对象(随机字符串,{放置数据的容器})
                # - 将数据保存到“数据库”
                # - 把随机字符串写在用户cookie中。

    操作

    完全类似于字典操作

    # 设置值:
    session['key'] = 'xxx'
    
    # 取值:
    val = session.get('key','')
    val = session['key']
    
    # 删除:
    del session['key']

    流程

    请求到来 ---> 视图函数 ----> 请求结束

    当请求刚到来:

    flask读取cookie中session对应的值:eyJrMiI6NDU2LCJ1c2VyIjoib2xkYm95,将该值解密并反序列化成字典,放入内存以便视图函数使用。

    视图函数:

    注意需要设置 secret_key 不然会报错的。相当于加盐操作密钥。

    设置 session 和取 session 都是基于字典操作,和 django 差不多

    app.config['SECRET_KEY'] = os.urandom(24)
    
    
    @app.route('/hello')
    def hello_world():
        session["error"] = "hahah"
        print(session.values())
        return 'Hello World!'
    
    
    @app.route('/hi')
    def hi():
        return session.get("error", "没有")

     可以设置session 的保存时间,默认是31天

    app.config['PERMANENT_SESSION_LIFETIME']=timedelta(days=7) #设置session的保存时间。
    session.permanent=True # 将这个调整为 Trun 的时候才可以让上面的时间生效

    当请求结束:

    flask会读取内存中字典的值,进行序列化+加密,写入到用户cookie中。

    自定义session

    自定义Session

     第三方session 

    使用方式

    基于 flask_session 的在 redis 中的session操作

    #!/usr/bin/env python
    # -*- coding:utf-8 -
    import redis
    from flask import Flask, session
    from flask_session import Session
    
    app = Flask(__name__)
    app.debug = True
    app.secret_key = 'xxxx'
    
    app.config['SESSION_TYPE'] = 'redis'  # session类型为redis
    app.config['SESSION_PERMANENT'] = False  # 如果设置为True,则关闭浏览器session就失效。
    app.config['SESSION_USE_SIGNER'] = False  # 是否对发送到浏览器上session的cookie值进行加密
    app.config['SESSION_KEY_PREFIX'] = 'session:'  # 保存到session中的值的前缀
    app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port='6379', password='123123')  # 用于连接redis的配置
    
    Session(app)
    
    
    @app.route('/index')
    def index():
        session['k1'] = 'v1'
        return 'xx'
    
    
    if __name__ == '__main__':
        app.run()

     取舍

    如果应用程序比较小,就用原生的加密ccokie 保存session(内置)

    如果应用程序比较大,就用redis(flask-session)

    闪现

    在session中存储一个数据,读取时通过pop将数据移除

    应用场景

    通常用于对临时数据的操作

    实现的效果:

      创建后只能使用一次。使用完就消失了。

    无类别的闪现

    from flask import Flask, flash, redirect, render_template
         request, url_for
    
    app = Flask(__name__)
    app.secret_key = b'_5#y2L"F4Q8z
    xec]/'
    
    @app.route('/')
    def index():
        return render_template('index.html')
    
    @app.route('/login', methods=['GET', 'POST'])
    def login():
        error = None
        if request.method == 'POST':
            if request.form['username'] != 'admin' or request.form['password'] != 'secret':
                error = 'Invalid credentials'
            else:
                flash('You were successfully logged in')
                return redirect(url_for('index'))
        return render_template('login.html', error=error)

    带类别的

    from flask import Flask,flash,get_flashed_messages,request,redirect
    from werkzeug.datastructures import ImmutableMultiDict
    app = Flask(__name__)
    app.secret_key = 'asdfasdf'
    
    
    @app.route('/index')
    def index():
        val = request.args.get('v')
        if val == 'oldboy':
            return 'Hello World!'
        # 向某个地方设置一个值,category参数是分类的意思
        flash('超时错误',category="x1")
        return "ssdsdsdfsd"
        # return redirect('/error')
    
    
    @app.route('/error')
    def error():
        """
        展示错误信息
        :return:
        """
        # 从某个地方获取设置过的所有值,并指定分类,并清除。
        data = get_flashed_messages(category_filter=['x1'])
        if data:
            msg = data[0]
        else:
            msg = "..."
        return "错误信息:%s" %(msg,)
    
    
    if __name__ == '__main__':
        app.run()

     更多的详情 点击这里

  • 相关阅读:
    Luogu-P2295 MICE
    Luogu-P2627 修剪草坪
    Loj-10176-最大连续和
    Luogu-P1886 滑动窗口
    Luogu-P3807 【模板】卢卡斯定理
    Luogu-P1879 [USACO06NOV]玉米田Corn Fields
    Luogu-P1896 [SCOI2005]互不侵犯
    Loj-SGU 223-国王
    Luogu-P2657 [SCOI2009]windy数
    素数
  • 原文地址:https://www.cnblogs.com/shijieli/p/10355847.html
Copyright © 2011-2022 走看看