Flask:会话

HTTP是一个无状态的协议,客户端发送一个请求服务端回应一个结果,服务端要从大量请求中区分哪些请求属于同一个客户端发送的,这需要客户端对每次请求进行标识,属于同一个客户端发送的请求都携带相同的标识码,这个标识码被称为会话ID(SessionID),会话ID一般通过Cookie的形式在请求中进行传递,它通常是在第一次请求时产生并随同响应内容一道发送给客户端。

Cookie是一种在客户端保存少量信息的技术,在浏览器访问Web服务器某个资源时由服务器在HTTP响应消息头中传递给浏览器。浏览器可以设置是否保存Cookie一旦浏览器保存了该Cookie数据,那么以后的每次请求都会在请求消息头中将保存的Cookie数据回传给服务器。

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
from flask import Flask, request, make_response

app = Flask(__name__)

# 设置Cookie
@app.route("/set/<name>")
def set(name):
resp = make_response("set ok")
resp.set_cookie("name", name)
return resp

# 删除Cookie
@app.route("/delete")
def delete():
resp = make_response("delete cookie ok")
resp.delete_cookie("name")
return resp

# 查询Cookie
@app.route("/get")
def get():
return request.cookies.get("name", "None")

if __name__ == "__main__":
app.run()

运行上面的代码发现,当第一次访问/get时由于浏览器没有保存Cookie信息所以返回的是None,访问/set/xxx后浏览器保存了Cookie,再次访问/get返回的是你保存的Cookie值。

代码说明: 视图函数不仅可以返回字符串还可以返回一个响应对象,而 make_response() 函数的作用就是帮我们构造一个响应对象,由于Cookie是跟响应一起回传给浏览器的所以要附加在响应对象上。request.cookies 是一个字典,里面封装了请求头里的Cookie信息。

服务端还可以控制Cookie在客户端的保存时间,单位为秒

1
resp.set_cookie("name", name, max_age=10)

Session

由于Cookie保存的信息有限,而且每次访问都会带数据过来影响网络传输效率。为此,大部分服务端都提供了将信息保存在服务端的技术:Session。每个Session都有一个唯一的ID,通过Cookie回传给客户端,客户端每次请求只需把Session ID回传过来即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from flask import Flask, session

app = Flask(__name__)
app.config["SECRET_KEY"] = "abc"

@app.route("/set/<name>")
def set(name):
session["name"] = name
return "set ok"

@app.route("/delete")
def delete():
session.pop("name")
return "delete ok"

@app.route("/get")
def get():
return session.get("name", "None")

if __name__ == "__main__":
app.run()

代码说明: session与request一样它也是一个本地代理对象,是dict类型的子类可以保存任意类型的数据,使用会话必须配置 SECRET_KEY,也可以通过如下方式配置

1
app.secret_key = "abc"

如果想删除session保存的所有信息可以这样

1
session.clear()

保存在Session中的数据只能在一次会话中可以获取到,当开启浏览器到关闭浏览器即为一次会话,因为保存Session ID的Cookie只在当前浏览器进程中有效。

服务端无法判断客户端是否还会继续访问,如果某个客户端在一段时间内没有发出后续请求,服务端就认为该客户端已经停止了活动,就会在空闲时销毁为该客户端创建的Session对象,可以手动配置其超时时长,单位为秒

1
app.config["PERMANENT_SESSION_LIFETIME"] = 10

  • 本文作者: Harmel
  • 本文链接: http://www.harmel.cn/2018/08/flask-session.html
  • 版权声明: 文章如无特别说明,则表明该文章为原创文章,如需要转载,请注明出处。
  • 本站说明: 本站使用阿里云服务器,如果您喜欢我的网站,欢迎收藏,能捐赠支持一下就再好不过了。