首先写一下cookie和session的概念,然后是Flask中session的工作机制以及操作session

### cookie:

1. `cookie`出现的原因:在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie只是存储这些数据的盒子)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。
2. 如果服务器返回了`cookie`给浏览器,那么浏览器下次再请求相同的服务器的时候,就会自动的把`cookie`发送给浏览器,这个过程,用户根本不需要管。
3. `cookie`是保存在浏览器中的,相对的是服务器。

### session:
1. `session`介绍:session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。
2. 使用`session`的好处:
* 敏感数据不是直接发送回给浏览器,而是发送回一个`session_id`,服务器将`session_id`和敏感数据做一个映射存储在`session`(在服务器上面)中,更加安全。
* `session`可以设置过期时间,也从另外一方面,保证了用户的账号安全。

### flask中的session工作机制:

1. flask中的session机制是:把敏感数据经过加密后放入`session`中,然后再把`session`存放到`cookie`中,下次请求的时候,再从浏览器发送过来的`cookie`中读取`session`,然后再从`session`中读取敏感数据,并进行解密,获取最终的用户数据。
2. flask的这种`session`机制,可以节省服务器的开销,因为把所有的信息都存储到了客户端(浏览器)。
3. 安全是相对的,把`session`放到`cookie`中,经过加密,也是比较安全的,这点大家放心使用就可以了。

主app文件代码:

from flask import Flask,session
import os
from datetime import timedelta app = Flask(__name__)
app.config["SECRET_KEY"] = os.urandom(24)
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)
# 添加数据到session中
# 操作session的时候,跟操作字典是一样的
# SECRET_KEY @app.route('/')
def hello_world():
session['username'] = 'hyq'
#如果没有指定session的过期时间,那么默认是浏览器关闭以后自动结束
#如果设置了session的permanent属性为True,那么过期时间是31天
session.permanent = True
return 'Hello World!' @app.route('/get/')
def get():
# session['username']
# session.get('username')
print(session.get('username'))
return session.get('username') @app.route('/delete/')
def delete():
print(session.get('username'))
session.pop('username')
print(session.get('username'))
return 'success' @app.route('/clear/')
def clear():
print(session.get('username'))
# 删除sesion中的所有数据
session.clear()
print(session.get('username'))
return 'success' if __name__ == '__main__':
app.run(debug=True)

可以看到session过期时间已经改成了7天

### 操作session:
1. session的操作方式:
* 使用`session`需要从`flask`中导入`session`,以后所有和`sessoin`相关的操作都是通过这个变量来的。
* 使用`session`需要设置`SECRET_KEY`,用来作为加密用的。并且这个`SECRET_KEY`如果每次服务器启动后都变化的话,那么之前的`session`就不能再通过当前这个`SECRET_KEY`进行解密了。
* 操作`session`的时候,跟操作字典是一样的。
* 添加`session`:`session['username']`。
* 删除:`session.pop('username')`或者`del session['username']`。
* 清除所有`session`:`session.clear()`
* 获取`session`:`session.get('username')`
2. 设置session的过期时间:
* 如果没有指定session的过期时间,那么默认是浏览器关闭后就自动结束
* 如果设置了session的permanent属性为True,那么过期时间是31天。
* 可以通过给`app.config`设置`PERMANENT_SESSION_LIFETIME`来更改过期时间,这个值的数据类型是`datetime.timedelay`类型。

需要注意的是:上面代码中随即生成了24位的密钥,启动服务器,运行浏览器(执行主视图函数)之后,session中的加密数据已经生成(username放进去了),这时如果重启服务器,之后直接执行get函数,是得不到username的,因为每重启一次服务器,密钥都会变化,session中的加密数据就不一样了,因此需要先执行主视图函数,再执行get函数,才能得到username

Flask web开发之路十一的更多相关文章

  1. Flask web开发之路九

    flask_scripts介绍 项目结构如下: flask_script_demo.py文件: from flask import Flask app = Flask(__name__) @app.r ...

  2. Flask web开发之路一

    之前学过一段时间的flask,感觉还是挺好用的,自己的专利挖掘项目也想这个web框架来搭建,于是重新开始基础学习 环境:win10,python3.6,pycharm2017,虚拟环境virtuale ...

  3. Flask web开发之路十四

    今天开始Flask的实战,创建一个项目,实现包括用户登录.注册.注销.发表博客.评论以及检索等功能 首先给出项目结构: 1.config.py文件: 存放各种配置信息 import os # dial ...

  4. Flask web开发之路十三

    g对象 ### 保存全局变量的g属性:g:global1. g对象是专门用来保存用户的数据的.2. g对象在一次请求中的所有的代码的地方,都是可以使用的. 项目结构: g_demo.py文件代码: f ...

  5. Flask web开发之路十二

    ge请求和post请求 ### get请求和post请求:1. get请求: * 使用场景:如果只对服务器获取数据,并没有对服务器产生任何影响,那么这时候使用get请求. * 传参:get请求传参是放 ...

  6. Flask web开发之路十

    首先介绍循环引用的问题: 当一个模块需要引用另一个模块的类,而另一个模块又需要引用这个模块的类时,就出现了循环引用,而没法导入类,这时候可以切断其中一条引用路径,增加一个模块 项目结构: models ...

  7. Flask web开发之路八

    今天写Flask_SQLAlchemy的外键及其关系 ### Flask-SQLAlchemy外键及其关系: 主app文件代码: from flask import Flask from flask_ ...

  8. Flask web开发之路七

    今天写SQLAlchemy数据库 首先介绍ORM的概念: ORM,Object类,Relationship:关系,Mapping:映射,也就是模型关系映射 flask-sqlalchemy是一套ORM ...

  9. Flask web开发之路六

    紧接着上篇文档,写模板继承和block,URL链接和加载静态文件 模板继承和block 项目结构 主app文件代码: from flask import Flask,render_template a ...

随机推荐

  1. 原创:vsphere概念深入系列二:vSphere交换机命令行查看排错

    1.如何查看VM的IP Addresses, MAC Addresses, Uplink ports, Port ID,VSS/VDS,portgroup,DVPort Group,vmnic Upl ...

  2. js 模拟call、apply、bind实现

    1.模拟call实现 Function.prototype.myCall = function (context) { var context = context || window // 给 con ...

  3. Oracle11g登录名和密码不区分大小写

    问题描述: oracle11g对账户密码实行大小写识别,烦的一比!想移除此限制 问题解决: oracle 11g以前的版本的用户名和密码是不区分大小写!oracle 11g 用户名和密码默认区分大小写 ...

  4. SciTe设置

    对于新手来说,如果没有正确的配置,它就不是那么好使,比如选择中文时候出现乱码,缩进也不是你想象中的样子. 由于配置参数不是采用图形界面,而且出看配置代码会比较混乱,所以大家要睁大眼睛好好看咯- 程序中 ...

  5. OpenCV 学习笔记 06 SIFT使用中出现版权问题error: (-213:The function/feature is not implemented)

    1 错误原因 1.1 报错全部信息: cv2.error: OpenCV(4.0.1) D:\Build\OpenCV\opencv_contrib-4.0.1\modules\xfeatures2d ...

  6. 详解shell编程中2>&1用法

    在使用 linux 命令或者 shell 编程时,这个用法常会遇到 2>&1 下面看一个命令示例,然后分析下他是如何工作的: ls foo > /dev/null 2>&am ...

  7. [svc]打通mysql主从同步

    MySQL数据库设置主从同步 主从同步的特点: 逻辑的 异步的 主从同步的作用 1.备份 2.读写分离 主从同步的步骤 准备环境 1, mysql版本一致 5.5以上 2, 主从数据库一致 主库mas ...

  8. ceph 的 bufferlist

    bufferlist是buffer::list的别名,其由来在 http://bean-li.github.io/bufferlist-in-ceph/ 中有非常详细的介绍 其p.p_off.off字 ...

  9. golang channel select

    尝试多个channel同时触发时,select的表现: package main import ( "fmt" "time" ) func loop(ch ch ...

  10. 【Java多线程】JDK1.5并发包API杂谈

    并发与并行 并发 一个或多个处理器执行更多的任务(通过划分时间片来执行更多的任务),从逻辑上实现同时运行: 如,N个并发请求在一个两核CPU上: 并行 N个处理器分别同时执行N个任务,从物理上实现同时 ...