Distributed Things

Distributed session

怎么使用flask来做分布式session,以及为什么要使用分布式的session。

因为cookie不太适合存一些敏感信息,所以一般敏感的信息会存到session里。但是大部分时候都是cookie和session结合使用。session是存在服务器里面的相对安全一点。

储存原理:

通过cookie存一个session_id,然后具体的数据是保存到session里面,而session会存到server里面。比如在用户登录之后服务器会在cookie里面保存一个session_id,下次再发起请求的时候会把该session_id携带上来,服务器根据session_id在session的库中获取用户的session数据。

flask默认采用的方式是将session数据加密,然后存到cookie里面。但是也可以换成别的方式。

session

先来了解一下flask默认的session的使用方法。因为要使用session所以必须要设置SECRET_KEY才能正常启动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
"""
by using flask session to learn distribute system
"""
import os
from flask import Flask, session, request

app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
app.config['SESSION_PERMANENT'] = False


@app.route('/', methods=["POST", "GET"])
def index():
# 获取session里面的key,如果不存在就返回nothing
return session.get('key', 'nothing')


@app.route('/test', methods=["POST", "GET"])
def session_test():
# 设置session里面key的值
session['key'] = 'TEST'
return 'ok'


@app.route('/set', methods=["POST", "GET"])
def set_key():
# 根据参数来设置session里面的key
key = request.args.get('key')
session['key'] = key
return 'ok'


@app.route('/get', methods=["POST", "GET"])
def get_key():
return session.get('key', 'nothing')

@app.route('/delete', methods=["POST", "GET"])
def get_key():
session.pop('key')
# del session['key']
# session.clear()
return 'ok'


if __name__ == '__main__':
app.run(debug=True)

在这里就不给大家截图了,大家可以自己输入这些代码尝试一下。

session的过期时间

如果没有设置session的有效时间,默认的就是关闭浏览器之后过期。如果设置session.permanent=True,那session默认31天之后过期。如果不想31天后过期可以设置app.config['PERMANENT_SESSION_LIFETIME'] = 3600来修改过期时间。

session的删除

session的储存方法类似字典。有三种删除的方法session.pop('key'), del session['key'], session.clear()最后一个表示清除整个session的数据。

分布式的session

利用flask-session把session存到服务器里面。flask-session支持多种数据库:

  • redis
  • memcached
  • filesystem
  • MongoDB
  • sqlalchmey

因为redis是把数据储存到内存上面的,速度相当快,所以一般用redis来储存session的。

首先把flask-seesionredis安装一下:

1
2
pip3 install flask-session
pip3 install redis

然后在代码里面配置redis的信息就好:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
"""
使用redis来配置session
类似分布式的session的数据
"""
import os
from flask import Flask, session, request
from flask_session import Session
from redis import Redis

app = Flask(__name__)

# 配置使用session的储存方式
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = Redis(
host='127.0.0.1',
port=6379
)

# 类似是否对session加密
app.config['SESSION_USE_SIGNER'] = True
app.config['SECRET_KEY'] = os.urandom(24)

# 是否长期使用session, 一般是关闭的, 浏览器关闭则session失效
app.config['SESSION_PERMANENT'] = False

# session有效时长
app.config['PERMANENT_SESSION_LIFETIME'] = 3600
Session(app)


@app.route('/', methods=["POST", "GET"])
def index():
return session.get('key', 'nothing')


@app.route('/test', methods=["POST", "GET"])
def session_test():
session['key'] = 'TEST'
return 'ok'


@app.route('/set', methods=["POST", "GET"])
def set_key():
key = request.args.get('key')
print(key)
session['key'] = key
return 'ok'


@app.route('/get', methods=["POST", "GET"])
def get_key():
return session.get('key', 'nothing')


if __name__ == '__main__':
app.run(debug=True)

我们可以通过redis-cli来查看相对应的session信息:

----- End Thanks for reading-----