社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用 Python 描述 Cookie 和 Session

Python中文社区 • 5 年前 • 418 次点击  

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

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

最 近 热 门 推 荐

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

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

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

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

▼ 点击下方阅读原文

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/29221
 
418 次点击