Flask 源码解析:session

本文介绍了Flask框架中的session机制,从session的基本概念到其实现原理,包括请求过程、session对象、签名算法和应答过程。通过示例展示了如何在Flask中使用session,并分析了session数据的安全性,提到了防止数据篡改的签名算法。同时,文章讨论了如何解密和检查session,以及在实际开发中如何选择更安全的session存储方式,如使用flask-session库。
摘要由CSDN通过智能技术生成

session 简介

在解析 session 的实现之前,我们先介绍一下 session 怎么使用。session 可以看做是在不同的请求之间保存数据的方法,因为 HTTP 是无状态的协议,但是在业务应用上我们希望知道不同请求是否是同一个人发起的。比如购物网站在用户点击进入购物车的时候,服务器需要知道是哪个用户执行了这个操作。

在 flask 中使用 session 也很简单,只要使用 from flask import session 导入这个变量,在代码中就能直接通过读写它和 session 交互。

from flask import Flask, session, escape, request


app = Flask(__name__)

app.secret_key = 'please-generate-a-random-secret_key'



@app.route("/")

def index():

    if 'username' in session:

        return 'hello, {}n'.format(escape(session['username']))

    return 'hello, strangern'



@app.route("/login", methods=['POST'])

def login():

    session['username'] = request.form['username']

    return 'login success'



if __name__ == '__main__':

    app.run(host='0.0.0.0', port=5000, debug=True)

上面这段代码模拟了一个非常简单的登陆逻辑,用户访问 POST /login 来登陆,后面访问页面的时候 GET /,会返回该用户的名字。我们看一下具体的操作实例(下面的操作都是用 httpie 来执行的,使用 curl 命令也能达到相同的效果):

直接访问的话,我们可以看到返回 hello stranger

➜  ~ http -v http://127.0.0.1:5000/

GET / HTTP/1.1

Accept: */*

Accept-Encoding: gzip, deflate

Host: 127.0.0.1:5000

User-Agent: HTTPie/0.8.0



HTTP/1.0 200 OK

Content-Length: 14

Content-Type: text/html; charset=utf-8

Date: Wed, 01 Mar 2017 04:22:18 GMT

Server: Werkzeug/0.11.2 Python/2.7.10


hello stranger

然后我们模拟登陆请求, -v 是打印出请求, -f 是告诉服务器这是表单数据, \--session=mysession 是把请求的 cookie 等信息保存到这个变量中,后面可以通过变量来指定 session:

➜  ~ http -v -f --session=mysession POST http://127.0.0.1:5000/login username=cizixs

POST /login HTTP/1.1

Accept: */*

Accept-Encoding: gzip, deflate

Content-Length: 15

Content-Type: application/x-www-form-urlencoded; charset=utf-8

Host: 127.0.0.1:5000

User-Agent: HTTPie/0.8.0


username=cizixs


HTTP/1.0 200 OK

Content-Length: 13

Content-Type: text/html; charset=utf-8

Date: Wed, 01 Mar 2017 04:20:54 GMT

Server: Werkzeug/0.11.2 Python/2.7.10

Set-Cookie: session=eyJ1c2VybmFtZSI6ImNpeml4cyJ9.C5fdpg.fqm3FTv0kYE2TuOyGF1mx2RuYQ4; HttpOnly; Path=/


login success

最重要的是我们看到 response 中有 Set-Cookie 的头部,cookie 的键是 session,值是一堆看起来随机的字符串。

继续,这个时候我们用 \--session=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值