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='', password='') # 用于连接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()

更多的详情 点击这里

11.4 Flask session,闪现的更多相关文章

  1. Flask - 请求响应 | session | 闪现 | 请求扩展 | 中间件

    请求响应 flask的请求信息都在request里 flask的响应方式有四剑客,也可以自定义响应 请求相关信息 # request.method 提交的方法 # request.args get请求 ...

  2. Flask消息闪现

    目录 Flask消息闪现 简单的例子 闪现消息的类别 过滤闪现消息 Message Flashing 参考 Flask消息闪现 一个好的应用和用户界面都需要良好的反馈.如果用户得不到足够的反馈,那么应 ...

  3. Flask Flash闪现

    Flash介绍以及工作方式 flash中添加消息 取出flash中的消息 Flash介绍以及工作方式 - 介绍: flash :闪现 一个好的应用和用户界面都需要良好的反馈. 如果用户得不到足够的反馈 ...

  4. flask-admin章节四:flask session的使用

    1. 关于session flask session可能很多人根本都没有使用过,倒是cookie大家可能使用得比较多.flask cookie使用起来比较简单,就两个函数,读取和设置. 具体使用方式如 ...

  5. Flask Session 详解

    会话session ,允许你在不同请求 之间储存信息.这个对象相当于用密钥签名加密的 cookie ,即用户可以查看你的 cookie ,但是如果没有密钥就无法修改它. from flask impo ...

  6. Flask Session 使用和源码分析 —— (6)

    基本使用 from flask import Flask, session, redirect, url_for, escape, request app = Flask(__name__) @app ...

  7. flask session

    flask session工作机制: 把敏感数据经过加密后放入到‘session’中,然后在把'session'存放到cookie中,下次请求的时候,再从浏览器发送过来的cookie中读取sessio ...

  8. 搞懂分布式技术11:分布式session解决方案与一致性hash

    搞懂分布式技术11:分布式session解决方案与一致性hash session一致性架构设计实践 原创: 58沈剑 架构师之路 2017-05-18 一.缘起 什么是session? 服务器为每个用 ...

  9. 【Flask】Flask Session操作

    ### session:1. session的基本概念:session和cookie的作用有点类似,都是为了存储用户相关的信息.不同的是,cookie是存储在本地浏览器,session是一个思路.一个 ...

随机推荐

  1. MongoDB的存储结构及对空间使用率的影响

    MongoDB的存储结构及对空间使用率的影响 使用MongoDB一段时间的同学肯定会发现,MongoDB往往会占用比实际数据大小多不少空间的问题.如果利用db.stats()命令去查看,会发现Mong ...

  2. 跨进程SharedPreferences异常。

    诡异的SharedPreferences异常,在ACC之后,SharedPreferences获取不到值了,但是另一个应用可以获取到值.同样的方法,一个正常一个异常. Context c = null ...

  3. 关于flutter插件地图的使用flutter_map

    关于flutter插件地图的使用flutter_map flutter_map A Dart implementation of Leaflet for Flutter apps.一个基于leafle ...

  4. Android 使用Glide加载网络图片等比例缩放

    在做android图片加载的时候,由于手机屏幕受限,很多大图加载过来的时候,我们要求等比例缩放,比如按照固定的宽度,等比例缩放高度,使得图片的尺寸比例得到相应的缩放,但图片没有变形.显然按照andro ...

  5. C++ 11 Lambda表达式

    C++11的一大亮点就是引入了Lambda表达式.利用Lambda表达式,可以方便的定义和创建匿名函数.对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多 ...

  6. Docker Data Center系列(二)- UCP安装指南

    本系列文章演示如何搭建一个mini的云平台和DevOps实践环境. 基于这套实践环境,可以部署微服务架构的应用栈,演练提升DevOps实践能力. 1 系统要求 1.1 硬件和软件要求 Linux内核版 ...

  7. Ubuntu 18.04 安装博通(Broadcom)无线网卡驱动

    目录 Ubuntu 18.04 安装博通(Broadcom)无线网卡驱动 Package gcc is not configured yet. 解决办法 history history | grep ...

  8. Codechef Bear and Clique Distances

    题目:Bear and Clique Distances 描述:共有N个点,前1—K个点任意两点之间有一条无向边,边的权值为X,再任意给M条边(u,v,w)(不重复),求任意一点到其余各点的最短路. ...

  9. LeetCode算法题-Maximum Average Subarray I(Java实现)

    这是悦乐书的第278次更新,第294篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第146题(顺位题号是643).给定由n个整数组成的数组,找到具有最大平均值的长度为k的 ...

  10. Redis操作string

    Redis简介: ''' redis: 缓存,例如两个个程序A,B之间要进行数据共享,A可以把数据存在redis(内存里),其他程序都可以访问redis里的数据, 这样通过中间商redis就实现了两个 ...