session
加密后放在用户浏览器的 cookie 中
于 django 的自带 session 不同, flask 的 session 需要导入
from flask import session
内部流程
- # - 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['username'] = 'xxx'
- # 取值:
- session.pop('username', None)
使用前需要加密钥
App.secret_key = "sdfsdgrgasdgewrgw"
流程
请求到来 ---> 视图函数 ----> 请求结束
当请求刚到来:
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()
更多的详情 点击这里
来源: http://www.bubuko.com/infodetail-2947257.html