11.4 Flask session,闪现

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()

更多的详情 点击这里

原文地址:https://www.cnblogs.com/shijieli/p/10355847.html

时间: 2024-08-04 02:25:07

11.4 Flask session,闪现的相关文章

Flask消息闪现

目录 Flask消息闪现 简单的例子 闪现消息的类别 过滤闪现消息 Message Flashing 参考 Flask消息闪现 一个好的应用和用户界面都需要良好的反馈.如果用户得不到足够的反馈,那么应用最终会被用户唾弃. Flask 的闪现系统提供了一个良好的反馈方式. 闪现系统的基本工作方式是: 在且只在下一个请求中访问上一个请求结束时记录的消息. 一般我们 结合布局模板来使用闪现系统. 注意,浏览器会限制 cookie 的大小,有时候网络服 务器也会.这样如果消息比会话 cookie 大的话

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

1. 关于session flask session可能很多人根本都没有使用过,倒是cookie大家可能使用得比较多.flask cookie使用起来比较简单,就两个函数,读取和设置. 具体使用方式如下: 读取cookie from flask import request @app.route('/') def index(): username = request.cookies.get('username') # 使用 cookies.get(key) 来代替 cookies[key] ,

Flask Session 详解

会话session ,允许你在不同请求 之间储存信息.这个对象相当于用密钥签名加密的 cookie ,即用户可以查看你的 cookie ,但是如果没有密钥就无法修改它. from flask import Flask, session, redirect, url_for, escape, request app = Flask(__name__) @app.route('/') def index(): if 'username' in session: return 'Logged in a

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

搞懂分布式技术11:分布式session解决方案与一致性hash session一致性架构设计实践 原创: 58沈剑 架构师之路 2017-05-18 一.缘起 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文. Web开发中,web-server可以自动为同一个浏览器的访问用户自动创建session,提供数据存储功能.最常见的,会把用户的登录信息.用户信息存储在session中,以保持登录状态. 什么是session一致性问题? 只要

雷林鹏分享:Flask消息闪现

一个基于GUI好的应用程序需要向用户提供交互的反馈信息. 例如,桌面应用程序使用对话框或消息框,JavaScript使用alert()函数用于类似的目的. 在Flask Web应用程序中生成这样的信息消息很容易. Flask框架的闪现系统使得可以在一个视图中创建一个消息并将其呈现在名为next的视图函数中. Flask模块包含flash()方法. 它将消息传递给下一个请求,该请求通常是一个模板. flash(message, category) 在这里 - message - 参数是要刷新的实际

flask——session

一·.什么是session? 在解析 session 的实现之前,我们先介绍一下 session 怎么使用.session 可以看做是在不同的请求之间保存数据的方法,因为 HTTP 是无状态的协议,但是在业务应用上我们希望知道不同请求是否是同一个人发起的.比如张三,王二都在自己的手机上用淘宝购物,将想购买的商品放入购物车中,当王二,张三结账时,不能将他俩的购物车混淆了,服务器区分和保存购物车数据的方法就是session. flask的session是基于cookie的会话保持.简单的原理即: 当

Flask -- 消息闪现、错误处理

flash 可以在任何需要的地方添加,类似于print from flask import flash @app.route('/') def index(): flash('You are in home page now') return render_template('index.html') #index.html {% for message in get_flashed_messages() %} # 和session一样, 可以在模板中直接使用 {{ message }} {%

11.3 Flask 视图,模板

视图 FBV def index(nid): """ 请求相关信息 * request.method * request.args * request.form * request.values * request.cookies * request.headers request.path request.full_path request.script_root request.url request.base_url request.url_root request.h

11.2 Flask 配置文件,路由系统

配置文件系统 自定义配置文件 创建一个 setting.py 用于存放配置文件的相关属性 配置文件中可以进行分级继承来区分不同视图的配置文件设置 默认配置文件放在项目根路径下 # settings.py class Base(object): # 所有的都要有用到的配置更改 TEST = True class Dev(Base): DEV = True class Pro(Base): PRO = True 配置文件的设置方式 常用的是以下三种 # 方式1 直接更改 app.config["要更