问题场景:

  在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. licecap软件——简单做出app的效果gif图

    最近想在博客或者是git上放gif效果图,找了许久,终于是找到了这款软件,不到500Kb大小,使用简单 软件名为licecap,直接百度上搜索即可 使用的话,打开软件,就会出现一个窗口 之后,可以改变 ...

  2. SpringMVC页面向Controller传参

    关于SpringMVC页面向Controller传参的问题,看了网上不少帖子,大多总结为以下几类: 1.直接把页面表单中相关元素的name属性对应的值作为Controller方法中的形参. 这个应该是 ...

  3. 理解sort()函数的排序原理

    看了很多关于sort()函数的定义和解释还是不太清楚,尤其是初学者很容易看懵,这里讲讲自己是如何理解的. 首先,要理解sort()内部是利用递归进行冒泡排序的: 例如: var arr = [1, 5 ...

  4. 深度 | AI芯片终极之战

    深度 | AI芯片终极之战 https://mp.weixin.qq.com/s?__biz=MzA4MTQ4NjQzMw==&mid=2652712307&idx=1&sn= ...

  5. AEAI HR薪资汇总功能介绍

    1 概述 人力资源系统是一个公司重要的管理工具,而薪资管理是人力资源管理系统中最为核心的功能模块,它包括不同员工的薪资标准.薪资的组成部分,例如:对奖惩管理.保险和年假等员工必备的福利待遇进行统一管理 ...

  6. Android网页打开指定App

    一.只打开APP操作 通过用手机的浏览器(内置,第三方都可)访问一个网页,实现点击一个链接启动自己的应用,并传递数据. 首先在Mainifest文件里面对要启动的Activity添加一个过滤器. 网页 ...

  7. Android为TV端助力linux命令

    从命令行push到系统目录,用户组是root,而代码里面的是个人用户组,所以要把你push进去的东西改成跟你APK一样的用户组,并且chmod -R 777 文件名修改文件的权限 修改用户组chown ...

  8. MIUI10系统怎么样刷成开发版获得ROOT权限

    小米的设备不同手机型号正常情况下小米官方论坛都提供两个不同系统,可分为稳定版和开发版,稳定版没有提供root超级权限管理,开发版中就提供了root超级权限,在很多工作的时候我们需要使用的一些功能强大的 ...

  9. centos7 安装java运行环境

    1.检测是否存在相关历史版本 shell:java-version 1.1.存在相关OpenJDK和其他版本SDK则需要删除,如图. 查看详细信息,命令窗口输入,shell:rpm -qa | gre ...

  10. js 条件判断

    练习 小明身高1.75,体重80.5kg.请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数: 低于18.5:过轻 18.5-25:正常 25-28:过重 28-32:肥 ...