问题场景:

  在falsk项目中导入了两个session:

    首先,配置文件config.py文件中 有个 flask_session扩展导入了Session  ( from flask_session import Session );

  然后,在login.py文件的登录接口中  有从flask导入了session   (from flask import session);

先阐述一下状态保持的概念以及浏览器服务器如何实现状态保持:

  1 状态保持:
    有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等,
    实现状态保持主要有两种方式:使用Cookie在客户端存储信息,使用Session在服务器端存储信息

    1.1.Cookie:
    ▪Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。

    ▪应用:最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookie的功用。
    ▪提示:Cookie基于域名安全,不同域名的Cookie是不能互相访问的
如:访问jingdong.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到jingdong.com写的Cookie信息,浏览器的同源策略。

    1.2.session:
对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息,在服务器端进行状态保持的方案就是Session,Session依赖于Cookie

  2、区别:

    2.1  当然,在flask项目中也要实现状态保持,把Cookie存储在浏览器,session存储到服务器,但是当我们的用户量较大时,各种状态保持信息(用户信息,浏览历史信息等)都放到session中,就会大大的增加服务器的负荷,为了减轻服务器的压力,我们就把session放到redis数据库中,另外,redis数据库读取数据也是更快的,这个功能的实现靠的就是flask-session扩展中的Session;  即session是基于浏览器的cookie进行保存在服务器上的,flask_session可以把session的值存储在redis数据库中。这个session无论用户登录还是退出,只要不过期,就一直存在,与框架无关,与语言无关,便于用户在浏览器端再次便捷登录。

    2.2  from flask import session  这个sesssion是flask框架内置的请求上下文对象,用来操作记录http请求的数据或session信息,在请求过程中存在,请求结束后就被销毁;比如只有登录的用户并且发送http请求时,它才被唤醒存储内容,用户退出时,它又被销毁;在本flask项目的应用场景:

      (1) 在登录接口,用户用过mobile 和password验证后(用户存在且密码正确),我们就通过mobile查询出该用户对象user, 再把该登录用户的name,user_id, mobile 保存到上下文session中,方便其他模块接口的调用当前登陆的用户信息。

      (2) 在登录接口实现登陆以后,我们如何在其他接口判断用户是否登录呢?很简单,我们只需用user_id = session.get("user_id"),如果user_id存在,就说明用户已经通过了登录接口的验证和session信息的保存。因为很多接口都要判断登录状态,我们通常把这个功能放到装饰其中(即重写flask_login的login_required方法),方便各接口调用

    在utils/common.py文件中重写login_required方法:

    

 def login_required(func):
'''检查用户的登录状态'''
@wraps(func)
def wrapper(*args, **kwargs):
# 核心逻辑 获取session的id
user_id = session.get('user_id')
if user_id is not None:
# 表示用户已经登录
# 后面的接口仍需要user_id数据,来获取当前登陆的用户
# 为了方便,可以使用g变量来记录,避免多次访问保存session的redis服务器或项目服务器(根据session存放的位置)
g.user_id = user_id
return func(*args, **kwargs)
else:
retrun jsonify(error='', errmsg='用户未登录')
return wrapper

    在其他接口的应用:(判断是否登录和获取登录用户id,这也是login_required的两个功能, 不重写的话只有判断功能)

 from ihome.utils.common import login_required

 @api.route("/sessions", methods=["DELETE"])
@login_required # 验证登录装饰器
def logout():
"""登出"""
# 清除session数据, csrf_token需要保留.
csrf_token = session['csrf_token']
session.clear()
session['csrf_token'] = csrf_token # 删除session的方式:3种
# 1.session.pop() 2. 和Django所学相同 3. session.clear()全部删除 return jsonify(errno=RET.OK, errmsg="OK")

flask 状态保持session和上下文session的区别的更多相关文章

  1. Flask中的CBV和上下文初步解读

    一 . flask中的CBV 相对于Django中的CBV,让我们来看看flask中的CBV是如何实现的 ? from flask import Flask, render_template, url ...

  2. Flask 进阶session和上下文管理解析

    session的源码流程 将session放置在redis中 安装 pip install flask-session 使用 import redis from flask import Flask, ...

  3. jsp中的session和上下文

    Session的典型应用: 防止用户非法登录到某个页面. 网上商城的购物车 保存用户登录信息 注:多个请求要用的东西放在session中,多个会话之间要用的东西放在上下文中. 如何创建session? ...

  4. Flask - 请求处理流程和上下文源码分析

    目录 Flask - 请求处理流程和上下文 WSGI Flask的上下文对象及源码解析 0. 请求入口 1.请求上下文对象的创建 2. 将请求上下文和应用上下文入栈 3.根据请求的URl执行响应的视图 ...

  5. Asp.Net进程外Session(状态服务器Session、数据库Session)

    介绍 我们知道,当浏览器关闭,或者网站重启的时候,会话就结束了.即Seesion就丢失了.(当Web.config配置文件改动,哪怕什么内容都不加,仅仅往配置文件中加一个空格都是改we.config变 ...

  6. Flask框架里的cookie和session

    # -*- encoding: utf-8 -*- #cookie 相关的操作,依赖与make_response库,调用cookie依赖request模块 from flask import Flas ...

  7. Flask中的session ,自定义实现 session机制, 和 flask-session组件

    session 是基于cookie实现, 保存在服务端的键值对(形式为 {随机字符串:'xxxxxx'}), 同时在浏览器中的cookie中也对应一相同的随机字符串,用来再次请求的 时候验证: 注意 ...

  8. [原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. Flask基础(3):session、flash、特殊装饰器、蓝图、路由正则匹配、上下文管理 & flask-session

    Session: Flask 默认将 session 以加密的形式放到了浏览器的 cookie 中 Flask 的 session 就是一个字典,字典有什么方法 session 就有什么方法 flas ...

随机推荐

  1. MySQL查询执行的基础——查询优化处理

    查询的生命周期的下一步是将一个SQL转换成一个可执行计划,MySQL再按照这个计划和存储引擎进行交互 语法解析器和预处理 首先,MySQL通过关键词将SQL语句进行解析,并生成一颗对应的"解 ...

  2. Spring中BeanFactory的对象注册与依赖绑定方式

    概念 BeanFactory是spring的基础类型IOC容器,提供完整的IOC服务支持 默认采用延迟初始化策略,当客户端对象访问受管对象时,才对其进行初始化和依赖注入 理解 BeanFactory将 ...

  3. 如何清理Docker占用的磁盘空间?

    摘要:用了 Docker,好处挺多的,但是有一个不大不小的问题,它会一不小心占用太多磁盘,这就意味着我们必须及时清理. 作为一个有信仰的技术公司,我们Fundebug的后台采用了酷炫的全 Docker ...

  4. splay详解(三)

    前言 上一节我们学习了splay所能解决的基本问题,这节我来讲一下splay怎么搞区间问题 实现 splay搞区间问题非常简单,比如我们要在区间$l,r$上搞事情,那么我们首先把$l$的前驱旋转到根节 ...

  5. 开源项目商业分析实例(1) - MonicaHQ

    本来写一篇开源商业模式的稿子,因为有四大主题,这个稿子有点大,导致现在半个月过去了,都还没有憋出来.   今天想想还是采用MVP(minimum viable product,最小化可行产品)模式吧. ...

  6. Android 解析标准的点击第三方文件管理器中的视频的intent

    解析标准的第三方视频intent private List<String> mCurPlayList = new ArrayList<String>(); private in ...

  7. 微信小程序(一),授权页面搭建

    wxml代码如下: <!--pages/index2/index2.wxml--> <view class="index2Container"> <i ...

  8. 使用synchronized的几种场景

    1.修饰一个方法synchronized 修饰一个方法很简单,就是在方法的前面加synchronized,例如: public synchronized void method() { // todo ...

  9. 商家APP店内点餐开启有桌台点餐模式

    商家APP店内点餐开启有桌台点餐模式 步骤一:管理员后台-配置管理--店铺配置--简易付tab页--是否支持扫码下单-是 步骤二:管理员后台-配置管理--设备管理--选择对应的机器--配置--云POS ...

  10. python粗谈面向对象(二)

    浅谈super() super并不是一个函数,是一个类名,形如super(B, self)事实上调用了super类的初始化函数,产生了一个super对象:Python的多继承类是通过mro的方式来保证 ...