Flask web开发之路十一
首先写一下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开发之路十一的更多相关文章
- Flask web开发之路九
flask_scripts介绍 项目结构如下: flask_script_demo.py文件: from flask import Flask app = Flask(__name__) @app.r ...
- Flask web开发之路一
之前学过一段时间的flask,感觉还是挺好用的,自己的专利挖掘项目也想这个web框架来搭建,于是重新开始基础学习 环境:win10,python3.6,pycharm2017,虚拟环境virtuale ...
- Flask web开发之路十四
今天开始Flask的实战,创建一个项目,实现包括用户登录.注册.注销.发表博客.评论以及检索等功能 首先给出项目结构: 1.config.py文件: 存放各种配置信息 import os # dial ...
- Flask web开发之路十三
g对象 ### 保存全局变量的g属性:g:global1. g对象是专门用来保存用户的数据的.2. g对象在一次请求中的所有的代码的地方,都是可以使用的. 项目结构: g_demo.py文件代码: f ...
- Flask web开发之路十二
ge请求和post请求 ### get请求和post请求:1. get请求: * 使用场景:如果只对服务器获取数据,并没有对服务器产生任何影响,那么这时候使用get请求. * 传参:get请求传参是放 ...
- Flask web开发之路十
首先介绍循环引用的问题: 当一个模块需要引用另一个模块的类,而另一个模块又需要引用这个模块的类时,就出现了循环引用,而没法导入类,这时候可以切断其中一条引用路径,增加一个模块 项目结构: models ...
- Flask web开发之路八
今天写Flask_SQLAlchemy的外键及其关系 ### Flask-SQLAlchemy外键及其关系: 主app文件代码: from flask import Flask from flask_ ...
- Flask web开发之路七
今天写SQLAlchemy数据库 首先介绍ORM的概念: ORM,Object类,Relationship:关系,Mapping:映射,也就是模型关系映射 flask-sqlalchemy是一套ORM ...
- Flask web开发之路六
紧接着上篇文档,写模板继承和block,URL链接和加载静态文件 模板继承和block 项目结构 主app文件代码: from flask import Flask,render_template a ...
随机推荐
- Apache Kafka学习 (二) - 多代理(broker)集群
1. 配置server.properties > cp config/server.properties config/server-1.properties> cp config/ser ...
- list与Set、Map区别及适用场景
1.List,Set都是继承自Collection接口,Map则不是 2.List特点: 元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放 ...
- (原)Show, Attend and Translate: Unsupervised Image Translation with Self-Regularization and Attention
转载请注明出处: https://www.cnblogs.com/darkknightzh/p/9333844.html 论文网址:https://arxiv.org/abs/1806.06195 在 ...
- gdb 拾遗
1,跳过某个特定信号 (gdb) handle SIGPIPE nostop noprint pass 2,break在特定的系统调用处 (gdb) catch syscall 3 3,遇到一个断点的 ...
- 门户级UGC系统的技术进化路线 [转]
原文链接 :http://weibo.com/p/1001603789147444803230 新闻门户网站的评论系统,或者称为跟帖.留言板,是所有门户网站的核心标准服务组件之一.与论坛.博客等其 ...
- C#sql语句
SQL语句大全删除数据库 drop database databasename SQL语句大全备份 --- 创建备份数据的 device USE master EXEC sp_addumpdevice ...
- python3版本中的zip函数
例如,有两个列表: 1 2 >>>a = [1,2,3] >>>b = [4,5,6] 使用zip()函数来可以把列表合并,并创建一个元组对的列表. 1 2 > ...
- js实现cookie跨域功能
/** * 设置cookie方法 * @param {string} name cookie键值 * @return {*} 返回cookie值 */ function setCookie_log(c ...
- 基于Python, Selenium, Phantomjs无头浏览器访问页面
引言: 在自动化测试以及爬虫领域,无头浏览器的应用场景非常广泛,本文将梳理其中的若干概念和思路,并基于代码示例其中的若干使用技巧. 1. 无头浏览器 通常大家在在打开网页的工具就是浏览器,通过界面上输 ...
- Node入门教程(12)第十章:Node的HTTP模块
Ryan Dahl开发node的初衷就是:把Nginx非阻塞IO功能和一个高度封装的WEB服务器结合在一起的东东.所以Node初衷就是为了高性能的Web服务器去的,所以:Node的HTTP模块也是核心 ...