用 Python 描述 Cookie 和 Session

640?wx_fmt=jpeg

Illustrations by Artur Sadlos


作者:爱看七龙珠

博客:zhihu.com/c_1046065830684614656

这篇文章我们来聊聊Cookie和Session,网上有很多关于这两个知识点的描述,可惜的是大部分都没有示例代码,因此本文的重点在于示例代码。

环境

Python3.6.0
Bottle0.12.15

安装bottle

pip install bottle

Cookie

HTTP是一种无状态协议,简单来说就是如果A第一次访问了B服务器,那么A第二次访问B服务器时,B服务器并不知道这次访问是否还是来自A。B服务器只负责接收网络信息包,传递网络信息包。这样速度很快,但是很不方便,B服务器不会记录A的数据。

为此,人们发明了Cookie,Cookie利用了HTTP中的Headers字段

HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 138
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Connection: close
cookie: _zap=8aa393b0-cc62-4c6a

现在A每次访问时都带上cookie,B服务器就可以获得A的cookie,这样B服务器就能记住一些东西

假如说我们现在要统计A一共访问了几次B服务器,我们可以编写以下代码

cookie.py

from bottle import route, run, response, request

@route('/hello')
def hello():
    count = request.get_cookie('visited')
    if count:
        increment = int(count) + 1
        response.set_cookie('visited', str(increment))
        return str(increment)
    else:
        response.set_cookie('visited''0')
        return 'Hello, World'

run(host='localhost', port=8080, debug=True)

需要说明一点:在整个传输过程中传输的是字符,如果传进去一个整数,那么会报错,因此数字必须转换为字符

执行 python cookie.py

640?wx_fmt=gif

Session

Session一般用于登录功能,我们利用Cookie实现了有状态的传输,那么完全可以设置一个id,每次访问的时候都会带上这个id,这样B服务器就能够识别是谁访问了

一般来说,拿到id之后会存储在数据库里面,为了方便起见,在这里只存储到字典里面

session.py

from bottle import route, run, response, request, redirect

login_user = {} #用来存储登录状态的字典

@route('/login')
def login():
    key = hash("test password")
    login_user[key] = "test password"
    response.set_cookie('login', str(key))
    return 'login successfuly!'

@route('/logout')
def logout():
    key = request.get_cookie('login')
    login_user.pop(int(key), None)
    return 'logout successfuly!'

@route('/logintest')
def logintest():
    key = request.get_cookie('login')
    if key is not None and int(key) in login_user:
        return 'login test successfuly!'
    else :
        return redirect('/beforelogin')

@route('/beforelogin')
def beforelogin():
    return 'please login!'

run(host='localhost', port=8080, debug=True)

执行

python session.py

640?wx_fmt=gif

最 近 热 门 推 荐

Python 带你走进哈利波特的魔法世界

深度解读Python深拷贝与浅拷贝问题

好嗨哦!用Python进行诗歌接龙

Python技术知识清单(基础知识)

640?wx_fmt=jpeg

▼ 点击下方阅读原文

免费成为社区注册会员,会员可以享受更多权益

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值