1.1. 概念
cookie: 在网站中, http 请求是无状态的. 也就是说即使第一次和服务器连接后并且登录成功后, 第二次请求服务器依然不能知道当前请求是哪个用户. cookie 的出现就是为了解决这个问题, 第一次登录后服务器返回一些数据 (cookie) 给浏览器, 然后浏览器保存在本地, 当该用户发送第二次请求的时候, 就会把上次请求存储的 cookie 数据自动的携带给服务器, 服务器通过浏览器携带的数据就能判断当前是哪个用户了. cookie 存储的数据量有限, 不同的浏览器有不同的存储大小, 但一般不超过 4kb. 因此使用 cookie 只能存储一些小量的数据.
session:session 和 cookie 的作用有点类似, 都是为了存储用户相关的信息. 不同的是, cookie 是存储在本地浏览器, 而 session 存储在服务器. 存储在服务器的数据会更加安全, 不容易被窃取. 但存储在服务器也有一定的弊端, 就是会占用服务器的资源, 但现在服务器已经发展至今, 存储一些 session 信息还是绰绰有余的.
cookie 和 session 结合使用: cookie 和 session 的使用已经出现了一些非常成熟的方案. 一般有两种存储方式
存储在服务端: 通过 cookie 存储一个 session_id, 然后具体的数据则保存在 session 中. 如果用户已经登录, 则服务器会在 cookie 中保存一个 session_id, 下次再请求的时候, 会把该 session_id 携带上, 服务器根据 session_id 在 sesson 库中获取用户的 session 数据. 就能知道该用户到底是谁, 以及之前保存的一些状态信息. 这种专业术语叫做 server side session.
将 session 数据加密, 然后存储在 cookie 中. 这种专业术语叫做 client side session.flask 采用的就是这种方式, 但是也可以替换成其它方式.
1.2. 设置 cookie
设置 cookie: 应该在 Response 的对象上设置. flask.Response 对象上有一个 set_cookie 方法, 可以通过这个方法来设置 cookie 信息.
- from flask import Flask,request,Response
- app = Flask(__name__)
- @app.route('/')
- def hello_world():
- resp = Response("服务器返回信息")
- #设置 cookie,
- resp.set_cookie('username','derek')
- return resp
- if __name__ == '__main__':
- app.run()
参数介绍: 源码
- def set_cookie(self, key, value='', max_age=None, expires=None,
- path='/', domain=None, secure=False, httponly=False,
- samesite=None):
key: 键
value: 值
max_age: 设置过期时间(秒)
expires: 设置过期时间, 时间戳的形式(1970 离现在的时间)
path: 当前主域名
domain: 子域名
1.3. 删除 cookie
删除 cookie, 通过 Response.delete_cookie 方法, 指定 cookie 的 key, 就可以删除 cookie 了
- @app.route('/del/')
- def delete_cookie():
- resp = Response("删除 cookie")
- #设删除 cookie,
- resp.delete_cookie('username')
- return resp
1.4. 设置 cookie 过期时间
参数解释:
max_age: 以秒为单位, 距离现在多少秒后 cookie 会过期
expires:datetime 类型, 这个时间需要设置为格林尼治时间, 也就是要距离北京少 8 个小时
如果 max_age 和 expires 都设置了, 那么这时候以 max-age 为标准
如果没有指定过期时间, 则默认为浏览器关闭后过期
代码如下:
- @app.route('/')
- def hello_world():
- resp = Response("设置 cookie")
- # 1. 使用 expires 参数, 就必须使用格林尼治时间
- # 通过 expires 参数设置有效期的时候, 就要相对北京时间少 8 个小时, 所有这里 hours 是 16,
- # 如果直接 days=31, 就不准确了
- expires = datetime.now() + timedelta(days=30,hours=16)
- resp.set_cookie('username','derek',expires=expires)
- # 2. 使用 max_age 参数设置过期时间(1 分钟后后期)
- # resp.set_cookie('username','derek',max_age=60)
- return resp
- 1.5. session
flask 操作 session
设置 session: 通过 flask.session 就可操作 session 了, 操作 session 就跟操作字典是一样的. session['username'] = 'derek'
获取 session: 也是类似字典, session.get('key')
删除 session:session.pop(key), 删除指定的值; session.clear(), 删除 session 中所有的值
设置 session 有效期: 如果没有设置 session 的有效期. 那么默认就是浏览器关闭后过期. 如果设置 session.parmanent=True, 那么就会默认 31 天后过期. 如果不想在 31 天后过期, 那么可以设置 app.config['PERMANENT_SESSION_LIFETIME']= timedelta(hour=2), 可以指定多久后过期(比如: 2 小时).
代码如下:
- from flask import Flask,session
- import os
- from datetime import timedelta
- app = Flask(__name__)
- app.config['SECRET_KEY'] = os.urandom(24)
- # 自定义设置 session 的有效期
- app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)
- @app.route('/')
- def index():
- # 设置 session
- session['username'] = 'derek'
- # permanent: 过期时间, 默认为 false, 如果设置为 True, 则默认为 31 天之后过期
- # 可以通过 app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)
- # 来自定义过期时间, 这样设置后, session.permanent = True 的 session 有效期则为两个小时
- session.permanent = True
- return 'Hello World!'
- @app.route('/get_session/')
- def get_session():
- #获取 session
- username = session.get('username') # derek
- return username
- @app.route('/delete_session/')
- def delete_session():
- #删除 session
- session.pop('username') #删除指定的 session
- # session.clear() #删除所有 session
- return '删除成功'
- if __name__ == '__main__':
- app.run(debug=True)
来源: https://www.cnblogs.com/derek1184405959/p/9103730.html