ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

11.4 Flask session,闪现

2019-02-08 08:51:40  阅读:467  来源: 互联网

标签:__ return 11.4 app error Flask session flask


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

 

 

 更多的详情 点击这里

 

标签:__,return,11.4,app,error,Flask,session,flask
来源: https://www.cnblogs.com/shijieli/p/10355847.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有