07.session与cookie

cookie:在网站中,HTTP请求是无状态的。也就是第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道请求的是哪个用户。cookie的出现是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4kb,因此使用cookie只能存储一些小量的数据

  • cookie有效期:服务器可以设置cookie的有效期,以后浏览器会自动的清除过期的cookie

  • cookie有域名的概念:只有访问同一个域名,才会把之前相同域名返回的cookie携带给服务器,也就是说,访问谷歌的时候,不会把百度的cookie发送给谷歌

set_cookie(self, key, value='',max_age=None, expires=None,path='/', domain=None,
secure=False, httponly=False,samesite=None)
  • secure设置为True只能在HTTPS协议下使用

  • httponly设置为True,cookie只能被浏览器读取,不能被js读取

  • expires无效日期

  • max_age:以秒为单位,距离现在多久过期

  • 设置cookie:设置cookieResponse对象上进行设置的,通过flask.Response对象上的一个set_cookie()方法来进行设置cookie信息

@app.route('/')
def test_cookie():
    response = Response("cookie")
    response.set_cookie("A","B")
    return response

image-20200905072844719

  • 删除cookie:通过flask.Response对象上的一个delete_cookie()方法来进行设置cookie信息

# 删除指定cookie
resp.delete_cookie("name")
  • 设置cookie的有效期,默认有效期:知道浏览器关闭为止

    • 使用max_age参数设置有效期事件

# max_age:距离多少秒后cookie值过期
resp.set_cookie("name","value",max_age=10)
  • 使用expires参数

1:	expires = datetime(year=2018,month=7,day=14,hour=16,minute=29,second=0)

2: 	# 使用expires参数,就必须使用格林尼治时间
	# 要相对北京时间少8个小时
	expires = datetime(year=2018, month=7, day=14, hour=8, minute=29, second=0)

3:	# 设置距离多久
	expires = datetime.now() + timedelta(seconds=1) - timedelta(hours=8)
	
resp.set_cookie("name", "value", expires=expires)

注意:max_age在IE8以下的浏览器是不支持的。expires在新班的http协议中被废弃,但是到目前为止所有的浏览器都能够支持它

设置cookie的有效域名:cookie只能在主域名下使用。如果想要在子域名下使用,那么应该给"set_cookie"传递一个domain='.ty.com'来指定其他子域名才能访问到这个cookie信息。

  1. 定义蓝图

cms.py

from flask import Blueprint

cms_bp = Blueprint("cms",name,subdomain="cms")

@cms.route("/")
def index():   
	return "cms 首页"  
  1. 注册蓝图

app.py

from cms import cms_bp
...
 # 注册蓝图  
app.register_blueprint(cms) 
app.config["SERVER_NAME"] = "ty.com:5000" 
....
  1. 地址映射:在hosts文件中添加以下映射

127.0.0.1 ty.com
127.0.0.1 cms.ty.com
  1. 设置set_cookie中的domain参数

resp = Response("name")
resp.set_cookie("name", "value",domain=".ty.com")

什么是session?

sessioncookie的作用类似,都是为了存储用户相关的信息,不同的是,cookie是存储在本地浏览器,session是一个思路/概念,一个服务器存储授权信息的解决方案,不同的服务器,不同的框架,不同的语言有不同的实现,虽然实现不一样,但是他们的目的都是服务器为了方便存储数据的。session的出现,是为了解决cookie存储数据不安全的问题的

由于随着web的开发,发展至今,一般有两种存储方式:

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

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

session用法

设置session

设置session在session对象上进行设置的,通过flask.session对象上的一个session.setdefault()方法或者字典来进行设置session信息

session.setdefault("name","angle")

or

session["name"] = "angle"

获取session

通过session.get()方法获取

name = session.get("name")

删除指定session

# 删除指定session
session.pop("name")

清除所有的session值

session.clear()

设置session有效期

通过配置config进行设置,默认有效期为31天

from datetime import timedelta
# 设置会话有效期时间:两个小时以后会话有效期时间过期
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)

# 设置session的过期时间,permanent:持久性,默认时间为一个月
session.permanent = True

注意,使用session需要配置SECRET_KEY

import os

# os.unrandom(n):产生24位的随机数
app.config["SECRET_KEY"] = os.urandom(24)

将session存储入redis中

安装

pip install flask-session
pip install redis

配置

from flask import Flask,request,session
from flask_session import Session
import redis,os

app = Flask(__name__)

app.config.update({
    "SECRET_KEY":os.urandom(20),         # 加密的密钥
    "SESSION_USE_SIGNER" : True,         # 是否对发送到浏览器上session的cookie值进行加密
    "SESSION_TYPE" : "redis",            # session类型为redis
    "SESSION_KEY_PREFIX" : "session",    # 保存到session中的值的前缀
    "PERMANENT_SESSION_LIFETIME" : 7200, # 失效时间,单位秒
    "SESSION_REDIS" : redis.Redis(host='127.0.0.1', port='6379', db=4)  # redis数据库连接
})

# 实例化对象
sess = Session()
# 初始化
sess.init_app(app)


@app.route('/')
def index():
    session['code'] = 'code'
    return 'Redis Session'

if __name__ == '__main__':
    app.run()
参数
含义

SECRET_KEY

加密的密钥

SESSION_USE_SIGNER

是否对发送到浏览器上session的cookie值进行加密

SESSION_TYPE

session类型为redis

SESSION_KEY_PREFIX

保存到session中的值的前缀

PERMANENT_SESSION_LIFETIME

失效时间,单位秒

SESSION_REDIS

redis数据库连接

image-20200906054235652

redis客户端

下载

image-20200906060142893

最后更新于

这有帮助吗?