Flask 中使用 cookie 与 session

Flask 学习笔记

一、cookie 和 session


1.1、cookie

        在网站中,HTTP 请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie 的出现就是为了解决这个问题。

        第一次登录后,服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地。当该用户发送第二次请求的时候,浏览器会自动的把上次请求存储的 cookie 数据携带发送给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie 存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过 4KB。因此使用 cookie 只能存储一些小量的数据。


1.2、session

        sessioncookie 的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie 是存储在本地浏览器,session 是一个思路、一个概念、一个服务器存储授权信息的解决方案,不同的服务器,不同的框架,不同的语言有不同的实现。虽然实现不一样,但是他们的目的都是在服务端存储用户和服务器会话的一些信息(如,是否登录、购物车功能)。session 的出现,是为了解决 cookie 存储数据不安全的问题的。


1.3、cookie 和 session 结合使用

        web开发发展至今,cookiesession 的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:

  1. 存储在服务端
            通过 cookie 存储一个 session_id ,然后具体的数据则是保存在 session 中。如果用户已经登录,则服务器会在 cookie 中保存一个 session_id,下次再次请求的时候,会把该 session_id 携带上来,服务器根据 session_idsession 库中获取用户的 session 数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做 server side session。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些 session 信息还是绰绰有余的。

  2. 加密存储
            将 session 数据加密,然后存储在 cookie 中。这种专业术语叫做 client side sessionflask 采用的就是这种方式,但是也可以替换成其他形式。




二、flask 中使用 cookie 和 session


2.1、cookie

        在 Flask 中操作 cookie,是通过 response 对象来操作,可以在 response 返回之前,通过 response.set_cookie 来设置,这个方法有以下几个参数需要注意:

  1. key:设置的 cookie 的 key。

  2. value:key 对应的 value。

  3. max_age:改 cookie 的过期时间,如果不设置,则浏览器关闭后就会自动过期。

  4. expires:过期时间,应该是一个 datetime 类型。

  5. domain:该 cookie 在哪个域名中有效。一般设置子域名,比如 cms.example.com

  6. path:该 cookie 在哪个路径下有效。

	@app.route("/")
	def index():
	    res = Response("添加cookie")
    	# 设置 3s 过期
	    res.set_cookie('usename', 'check', max_age=3)
	    return res

Flask 中使用 cookie 与 session_第1张图片


2.2、session

        Flask 中的 session 是通过 from flask import session 。然后添加值 keyvalue 进去即可。并且,Flask 中的 session 机制是将 session 信息加密,然后存储在 cookie 中。专业术语叫做 client side session

  1. 创建 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)

  1. 获取 session
	@app.route("/")
	def index():
	    # 获取 session
	    username = session.get('username')
	    print(username)
	    return "这是首页"

  1. 删除 session
	@app.route('/logout/')
	def logout():
	    # 删除 username
	    session.pop('username')
	    
	    # 清空 session
	    # session.clear()
	    
	    return "退出登录"

你可能感兴趣的:(Flask)