Flask的session

Posted abdm-989

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask的session相关的知识,希望对你有一定的参考价值。

### session:
1. session的基本概念:session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,session是一个思路、一个概念、一个服务器存储授权信息的解决方案,不同的服务器,不同的框架,不同的语言有不同的实现。虽然实现不一样,但是他们的目的都是服务器为了方便存储数据的。session的出现,是为了解决cookie存储数据不安全的问题的。
2. session与cookie的结合使用:
* session存储在服务器端:服务器端可以采用mysql、redis、memcached等来存储session信息。原理是,客户端发送验证信息过来(比如用户名和密码),服务器验证成功后,把用户的相关信息存储到session中,然后随机生成一个唯一的session_id,再把这个session_id存储cookie中返回给浏览器。浏览器以后再请求我们服务器的时候,就会把这个session_id自动的发送给服务器,服务器再从cookie中提取session_id,然后从服务器的session容器中找到这个用户的相关信息。这样就可以达到安全识别用户的需求了。
* session存储到客户端:原理是,客户端发送验证信息过来(比如用户名和密码)。服务器把相关的验证信息进行一个非常严格和安全的加密方式进行加密,然后再把这个加密后的信息存储到cookie,返回给浏览器。以后浏览器再请求服务器的时候,就会自动的把cookie发送给服务器,服务器拿到cookie后,就从cookie找到加密的那个session信息,然后也可以实现安全识别用户的需求了。

 

### flask操作session:
1. 设置session:通过`flask.session`就可以操作session了。操作`session`就跟操作字典是一样的。`session[‘username‘]=‘zhiliao‘`。
2. 获取session:也是类似字典,`session.get(key)`。
3. 删除session中的值:也是类似字典。可以有三种方式删除session中的值。
* `session.pop(key)`。
* `del session[key]`。
* `session.clear()`:删除session中所有的值。
4. 设置session的有效期:如果没有设置session的有效期。那么默认就是浏览器关闭后过期。如果设置session.permanent=True,那么就会默认在31天后过期。如果不想在31天后过期,那么可以设置`app.config[‘PERMANENT_SESSION_LIFETIME‘] = timedelta(hour=2)`在两个小时后过期。

技术图片
 1 # coding:utf-8
 2 from flask import Flask, session
 3 from datetime import timedelta
 4 import os
 5 
 6 app = Flask(__name__)
 7 app.config[SECRET_KEY] = os.urandom(24)
 8 app.config[PERMANENT_SESSION_LIFETIME] = timedelta(hours=5)
 9 
10 
11 @app.route(/)
12 def hello_world():
13     session[username] = saber
14     # session permanent 持久化置为True则session课保存31天.
15     session.permanent = True
16     return Hello World!
17 
18 
19 @app.route(/get_session/)
20 def get_session():
21     username = session.get(username)
22     return username or uno session set
23 
24 
25 @app.route(/delete_session/)
26 def delete_session():
27     # clear session ‘username‘
28     session.pop(username)
29     # clear all session.
30     session.clear()
31     return delete success.
32 
33 
34 
35 if __name__ == __main__:
36     app.run(debug=True)
技术图片

 

一、配置SECRET_KEY

因为flask的session是通过加密之后放到了cookie中。所以有加密就有密钥用于解密,所以,只要用到了flask的session模块就一定要配置“SECRET_KEY”这个全局宏。一般设置为24位的字符。配置方法一般有两种。

配置方法一:

新建一个config.py的文件配置secret_key 
config.py

 1 SECRET_KEY = XXXXXXXXX 

 

然后在主运行文件里面添加config文件里面的内容。 
main.py

技术图片
1 # encoding: utf-8
2 
3 from flask import Flask,session
4 import config
5 
6 app = Flask(__name__)
技术图片

 

配置方法二:

直接在主运行文件里面配置。配置config的时候也是和操作字典是一样的 
main.py

技术图片
1 # encoding: utf-8
2 
3 from flask import Flask,session
4 
5 app = Flask(__name__)
6 app.config[SECRET_KEY] = XXXXX
技术图片

 

产生方法

?可以引入OS模块中的产生一个24位的随机字符串的函数,这种方法有个缺点,就是服务器每次启动之后这个SECRET_KEY的值都会变。具体自己体会!

1 import os
2 
3 app.config[SECRET_KEY] = os.urandom(24) # 随机产生24位的字符串作为SECRET_KEY

 

二、操作session –操作session就如同操作字典!

1.设置session

技术图片
 1 from flask import Flask,session
 2 import os
 3 
 4 app = Flask(__name__)
 5 app.config[SECRET_KEY] = os.urandom(24)
 6 
 7 # 设置session
 8 @app.route(/)
 9 def set():
10     session[username] = liefyuan # 设置“字典”键值对
11     return success
12 
13 if __name__ == __main__:
14     app.run()
技术图片

 

2.读取session

?因为session就像字典一样所以,操作它的时候有两种方法:

  • (1)result = session[‘key’] :如果内容不存在,将会报异常
  • (2)result = session.get(‘key’) :如果内容不存在,将返回None

所以,使用第二种方法获取session较好。

技术图片
 1 from flask import Flask,session
 2 import os
 3 
 4 app = Flask(__name__)
 5 app.config[SECRET_KEY] = os.urandom(24)
 6 
 7 # 设置session
 8 @app.route(/)
 9 def set():
10     session[username] = liefyuan # 设置“字典”键值对
11     return success
12 
13 # 读取session
14 @app.route(/get)
15 def get():
16     # session[‘username‘]
17     # session.get(‘username‘)
18     return session.get(username)
19 
20 if __name__ == __main__:
21     app.run()
技术图片

 

3.删除session

技术图片
 1 #encoding: utf-8
 2 
 3 from flask import Flask,session
 4 import os
 5 
 6 app = Flask(__name__)
 7 app.config[SECRET_KEY] = os.urandom(24)
 8 
 9 
10 # 设置session
11 @app.route(/)
12 def set():
13     session[username] = liefyuan
14     return success
15 
16 
17 # 读取session
18 @app.route(/get/)
19 def get():
20     # session[‘username‘]
21     # session.get(‘username‘)
22     return session.get(username)
23 
24 
25 # 删除session
26 @app.route(/delete/)
27 def delete():
28     print session.get(username)
29     session.pop(username)
30     print session.get(username)
31     return success
32 
33 
34 if __name__ == __main__:
35     app.run()
技术图片

 

4.清除session中所有数据

技术图片
 1 #encoding: utf-8
 2 
 3 from flask import Flask,session
 4 import os
 5 
 6 app = Flask(__name__)
 7 app.config[SECRET_KEY] = os.urandom(24)
 8 
 9 
10 # 设置session
11 @app.route(/)
12 def set():
13     session[username] = liefyuan
14     return success
15 
16 
17 # 读取session
18 @app.route(/get)
19 def get():
20     # session[‘username‘]
21     # session.get(‘username‘)
22     return session.get(username)
23 
24 
25 # 删除session
26 @app.route(/delete)
27 def delete():
28     print session.get(username)
29     session.pop(username)
30     print session.get(username)
31     return success
32 
33 
34 # 清除session中所有数据
35 @app.route(/clear)
36 def clear():
37     print session.get(username)
38     # 清除session中所有数据
39     session.clear
40     print session.get(username)
41     return success
42 
43 if __name__ == __main__:
44     app.run()
技术图片

 

三、设置session的过期时间

?如果没有指定session的过期时间,那么默认是浏览器关闭后就自动结束。session.permanent = True在flask下则可以将有效期延长至一个月。下面有方法可以配置具体多少天的有效期。

  • 如果没有指定session的过期时间,那么默认是浏览器关闭后就自动结束
  • 如果设置了session的permanent属性为True,那么过期时间是31天。
  • 可以通过给app.config设置PERMANENT_SESSION_LIFETIME来更改过期时间,这个值的数据类型是datetime.timedelay类型。

使用的需求:

  • 1.在登录网页界面,下面有一个“记住我”选项,如果点击了则设置session的有效期长一点。就是设置这个!
技术图片
1 # 设置session
2 @app.route(/)
3 def set():
4     session[username] = liefyuan
5     session.permanent = True # 长期有效,一个月的时间有效
6     return success
技术图片

 

一种更先进的配置有效期的方法:(比如配置7天有效)

  • 1.引入包:from datetime import timedelta
  • 2.配置有效期限:app.config[‘PERMANENT_SESSION_LIFETIME‘] = timedelta(days=7) # 配置7天有效
  • 3.设置:session.permanent = True
技术图片
 1 #encoding: utf-8
 2 
 3 from flask import Flask,session
 4 from datetime import timedelta
 5 import os
 6 
 7 app = Flask(__name__)
 8 app.config[SECRET_KEY] = os.urandom(24)
 9 app.config[PERMANENT_SESSION_LIFETIME] = timedelta(days=7) # 配置7天有效
10 
11 
12 # 设置session
13 @app.route(/)
14 def set():
15     session[username] = liefyuan
16     session.permanent = True
17     return success
技术图片

 

Session的定义

Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。

对session的操作如下

技术图片
 1 from flask import Flask,session
 2 import os
 3 from datetime import timedelta
 4 app = Flask(__name__)
 5 app.config[SECRET_KEY]=os.urandom(24)   #设置为24位的字符,每次运行服务器都是不同的,所以服务器启动一次上次的session就清除。
 6 app.config[PERMANENT_SESSION_LIFETIME]=timedelta(days=7) #设置session的保存时间。
 7 #添加数据到session
 8 #操作的时候更操作字典是一样的
 9 #secret_key:----------盐,为了混淆加密。
10 
11 
12 @app.route(/)
13 def hello_world():
14     session.permanent=True  #默认session的时间持续31天
15     session[username] = xxx
16 
17     return Hello World!
18 
19 #获取session
20 @app.route(/get/)
21 def get():
22     return  session.get(username)
23 
24 #删除session
25 @app.route(/delete/)
26 def delete():
27     print(session.get(username))
28     session.pop(username)
29     print(session.get(username))
30     return delete
31 #清楚session
32 @app.route(/clear/)
33 def clear():
34     print(session.get(username))
35     session.clear()
36     print(session.get(username))
37     return clear
38 
39 if __name__ == __main__:
40     app.run(debug=True)
技术图片

SECRET_KEY

secret_key设置成os.urandom(24)这样的写法再项目中不合适,因为没次启动服务器这个值都会改变,所以所有保存的session都失效。现在只是学习阶段,所以就可以随机产生。

 

以上是关于Flask的session的主要内容,如果未能解决你的问题,请参考以下文章

Flask之Flask-Session -- 2019-08-11 19:38:31

Session处理实例—Flask网站制作(13)

代码在Flask中返回render_template后不起作用

flask 请求处理流程及其源代码分析sessioncookie生成源码

六十一:Flask.Session之flask操作session

Flask组件之Flask-session