Flask 学习笔记
一、cookie 和 session
1.1、cookie
在网站中,HTTP 请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie 的出现就是为了解决这个问题。
第一次登录后,服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地。当该用户发送第二次请求的时候,浏览器会自动的把上次请求存储的 cookie 数据携带发送给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie 存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过 4KB。因此使用 cookie 只能存储一些小量的数据。
1.2、session
session 和 cookie 的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie 是存储在本地浏览器,session 是一个思路、一个概念、一个服务器存储授权信息的解决方案,不同的服务器,不同的框架,不同的语言有不同的实现。虽然实现不一样,但是他们的目的都是在服务端存储用户和服务器会话的一些信息(如,是否登录、购物车功能)。session 的出现,是为了解决 cookie 存储数据不安全的问题的。
1.3、cookie 和 session 结合使用
web开发发展至今,cookie 和 session 的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:
-
存储在服务端
通过 cookie 存储一个 session_id ,然后具体的数据则是保存在 session 中。如果用户已经登录,则服务器会在 cookie 中保存一个 session_id,下次再次请求的时候,会把该 session_id 携带上来,服务器根据 session_id 在 session 库中获取用户的 session 数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session
。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些 session 信息还是绰绰有余的。
-
加密存储
将 session 数据加密,然后存储在 cookie 中。这种专业术语叫做client side session
。flask 采用的就是这种方式,但是也可以替换成其他形式。
二、flask 中使用 cookie 和 session
2.1、cookie
在 Flask 中操作 cookie,是通过 response 对象来操作,可以在 response 返回之前,通过 response.set_cookie
来设置,这个方法有以下几个参数需要注意:
-
key
:设置的 cookie 的 key。 -
value
:key 对应的 value。 -
max_age
:改 cookie 的过期时间,如果不设置,则浏览器关闭后就会自动过期。 -
expires
:过期时间,应该是一个 datetime 类型。 -
domain
:该 cookie 在哪个域名中有效。一般设置子域名,比如cms.example.com
。 -
path
:该 cookie 在哪个路径下有效。
@app.route("/")
def index():
res = Response("添加cookie")
# 设置 3s 过期
res.set_cookie('usename', 'check', max_age=3)
return res
2.2、session
Flask 中的 session 是通过 from flask import session
。然后添加值 key 和 value 进去即可。并且,Flask 中的 session 机制是将 session 信息加密,然后存储在 cookie 中。专业术语叫做 client side session
。
- 创建 session
from flask import Flask, session
import os
from datetime import timedelta
app = Flask(__name__)
# 用一个14位的随机字符串作为密钥对session进行加密
app.config['SECRET_KEY'] = os.urandom(14)
# 当然也可以用固定的字符串,只是加密的更安全
# app.config['SECRET_KEY'] = "aihaohvvap"
# 设置有效时间为 2h
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)
@app.route("/login")
def login():
# session 类似字典添加数据
session['username'] = 'check'
# 持久化 有效期
session.permanent = True
return "登录页面"
if __name__ == '__main__':
app.run(debug=True)
- 获取 session
@app.route("/")
def index():
# 获取 session
username = session.get('username')
print(username)
return "这是首页"
- 删除 session
@app.route('/logout/')
def logout():
# 删除 username
session.pop('username')
# 清空 session
# session.clear()
return "退出登录"