Flask 中的 session 的故事

Posted LeeTao

tags:

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

前言

凡是使用过 Flask,可能对 Flask 中  session 不陌生, 我们通常用 session 保存特定的用户信息,从而达到在 request 请求之间共享数据的目的,需要注意的一点 flask 中的 session 是基于 cookies 实现的,也就意味着着受制于 cookies,一旦出于某种原因 cookies 失效了,也就意味着 session 也会随之失效.

使用

关于 session 的使用方法也很简单, session[key] = value, 但是也存在需要注意的地方,接下来看一个例子

例子

from flask import Flask, session
app = Flask(__name__)
app.secret_key = "123"  # 使用 session 之前,必须要设置 secret_key

@app.route('/')
def create(): #1
    session['xxx'] = ['1','2','3']
    print(",".join(session['xxx']))
    return ",".join(session['xxx'])

@app.route('/rm/<id>')
 def rm(id): #2
    session['xxx'].remove(id)
    print(",".join(session['xxx']))
    return ",".join(session['xxx'])

@app.route('/add/<id>')
def add(id): #3
    session['xxx'].append(id)
    print(",".join(session['xxx']))
    return ",".join(session['xxx'])

@app.route('/test')
def out_print(): #4
     print(session['xxx'])
     print(",".join(session['xxx']))
     return ",".join(session['xxx'])

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

有趣的事情来了,我们按照 #1, #2(请求参数为2),#4, #3(请求参数为4), #4 的方式来请求 url,那么返回结果依次应该是什么呢?

结果

1,2,3
1,3
1,2,3
1,2,3,4
1,2,3

看一下截图:

原因

是不是觉得很奇怪,为什么我对 session 的修改没有生效? 这是因为 session 中有一个属性叫做 modified, 如果 session 发现其值有修改,如果修改的对象是可变的对象,则改修不会自动生效,除非手动设置 modified = True,也就是说我们需要上述的例子中 session 及时的被修改,需要在修改值后加入如下代码:

 session.modified = True

彩蛋

对于上述例子,在执行第二步之前,大家可以打开 Google 浏览器调试模式,找到 Application tab 页下的 Cookies,会发现里面有个 session-id 的 cookies,大家可以试着把它修改或者清空后再执行步骤 2,会有意想不到的彩蛋哟

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

12_关于flask中的宏

Flask 编写http接口api及接口自动化测试

Flask模板宏的概念和基本使用

Flask之模板之宏继承包含

沿用Python+Flask+Mysql的web建设技术开发网站

python Flask - 数据库片段