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\n\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()
更多的详情 点击这里
本文来自博客园,作者:羊驼之歌,转载请注明原文链接:https://www.cnblogs.com/shijieli/p/10355847.html